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)
endCoroutine-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
endsocket.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
endHTTP-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))
endOpenResty 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
- Eine einfache Ereignisschleife erstellen
- Async/Await mit Coroutinen
- Promise-ähnliche Muster
- Nicht blockierende E/A mit luasocket