0Pricing
Lua Academy · Lektion

Nicht blockierende E/A mit luasocket

Verwenden Sie luasocket im nicht blockierenden Modus, integriert in einen Coroutine-Scheduler

Nicht blockierende E/A mit luasocket ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist luasocket?

luasocket ist eine Lua-Bibliothek, die TCP-/UDP-Sockets sowie HTTP-, FTP- und SMTP-Clients bereitstellt. Standardmäßig arbeitet sie blockierend; der nicht blockierende Modus ermöglicht asynchrones I/O.

luasocket installieren

Installieren Sie luasocket über LuaRocks: luarocks install luasocket. Binden Sie es in Ihrem Skript mit Require ein.

local socket = require("socket")
local tcp = socket.tcp()

TCP-Socket erstellen

Erstellen Sie einen TCP-Client-Socket und verbinden Sie ihn mit einem Server.

local tcp = socket.tcp()
tcp:connect("example.com", 80)
tcp:send("GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
local response = tcp:receive("*a")
tcp:close()
print(response:sub(1, 200))

Nicht blockierender Modus

Setzen Sie den Socket mit tcp:settimeout(0) auf nicht blockierend. Lese- und Schreibvorgänge kehren sofort mit einem Timeout-Fehler zurück, wenn keine Daten bereitstehen.

tcp:settimeout(0)  -- non-blocking
local data, err = tcp:receive(1024)
if err == "timeout" then
  -- no data yet, try again later
elseif data then
  print("Got:", data)
end

Coroutine-Integration

Kombinieren Sie nicht blockierende Sockets mit Coroutines: Führen Sie einen Yield aus, wenn Daten noch nicht bereitstehen, und setzen Sie die Coroutine fort, sobald der Selector die Bereitschaft meldet.

local function readAsync(sock)
  while true do
    local data, err = sock:receive(1024)
    if data then return data end
    if err ~= "timeout" then error(err) end
    coroutine.yield()  -- let other tasks run
  end
end

socket.select

socket.select(readSet, writeSet, timeout) gibt Mengen von Sockets zurück, die für I/O bereit sind – die Grundlage einer geeigneten Event-Loop.

local readable, writable = socket.select({sock1, sock2}, nil, 0.1)
for _, s in ipairs(readable) do
  local data = s:receive(1024)
  -- handle data
end

HTTP-Client

luasocket enthält ein übergeordnetes HTTP-Modul für einfache Anfragen.

local http = require("socket.http")
local body, code = http.request("http://example.com")
print(code, #body)

UDP-Sockets

UDP ist verbindungslos. Verwenden Sie socket.udp() für die Kommunikation auf Basis von Datagrammen.

local udp = socket.udp()
udp:setsockname("*", 0)
udp:sendto("hello", "127.0.0.1", 9999)
local data = udp:receive()
udp:close()

Timeouts

Setzen Sie mit :settimeout(seconds) ein Timeout. Ein Timeout von 0 ist nicht blockierend, eine positive Zahl erlaubt teilweise blockierende Vorgänge und nil bedeutet, dass unbegrenzt gewartet wird.

Muster zur Fehlerbehandlung

luasocket-Funktionen geben bei einem Fehler nil und eine Fehlerzeichenkette zurück. Prüfen Sie immer den zweiten Rückgabewert.

local ok, err = tcp:connect("host", 80)
if not ok then
  error("Connection failed: " .. tostring(err))
end

OpenResty als Alternative

Für produktives nicht blockierendes I/O in LuaJIT sind die Cosockets von OpenResty wesentlich leistungsfähiger und performanter. Verwenden Sie luasocket für eigenständige Skripte und einfache Tools.

Frage zum nicht blockierenden Modus

Was bewirkt tcp:settimeout(0)?

Zusammenfassung: Nicht blockierendes I/O

Verwenden Sie settimeout(0) für nicht blockierende Sockets und socket.select für I/O-Multiplexing. Kombinieren Sie dies mit Coroutines: Führen Sie bei einem Timeout einen Yield aus und setzen Sie die Coroutine fort, sobald Daten bereitstehen. Für hochperformantes asynchrones I/O bevorzugen Sie OpenResty oder luv.

Häufig gestellte Fragen

Ist die Lektion „Nicht blockierende E/A mit luasocket“ kostenlos?

Ja — der vollständige Text von „Nicht blockierende E/A mit luasocket“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Nicht blockierende E/A mit luasocket“?

Verwenden Sie luasocket im nicht blockierenden Modus, integriert in einen Coroutine-Scheduler Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Nicht blockierende E/A mit luasocket“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Eine einfache Ereignisschleife erstellen
  2. Async/Await mit Coroutinen
  3. Promise-ähnliche Muster
  4. Nicht blockierende E/A mit luasocket
← Zurück zu Lua Academy