Lua Academy · Lektion

Icke-blockerande I/O med luasocket

Använd luasocket i icke-blockerande läge, integrerat med en korutinschemaläggare.

Lektion 4 av 413 steg

Icke-blockerande I/O med luasocket är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.

Vad är luasocket?

luasocket är ett Lua-bibliotek som tillhandahåller TCP-/UDP-socketar samt HTTP-, FTP- och SMTP-klienter. Som standard är det blockerande; icke-blockerande läge möjliggör asynkron I/O.

Installera luasocket

Installera via LuaRocks: luarocks install luasocket. Anropa require i skriptet.

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

Skapa en TCP-socket

Skapa en TCP-klientsocket och anslut till en 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))

Icke-blockerande läge

Ställ in socketen på icke-blockerande med tcp:settimeout(0). Läsningar och skrivningar returnerar omedelbart ett timeoutfel om inga data är redo.

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

Integrering med korutiner

Kombinera icke-blockerande socketar med korutiner: låt korutinen yielda när data inte är redo och återuppta den när selektorn visar att den är redo.

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) returnerar mängder av socketar som är redo för I/O — grunden för en riktig 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-klient

luasocket innehåller en högnivåmodul för HTTP för enkla förfrågningar.

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

UDP-socketar

UDP är anslutningslöst. Använd socket.udp() för datagram-baserad kommunikation.

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

Timeoutar

Ställ in en timeout med :settimeout(seconds). En timeout på 0 är icke-blockerande, ett positivt tal tillåter partiell blockering och nil innebär blockering på obestämd tid.

Mönster för felhantering

luasocket-funktioner returnerar nil plus en felsträng vid misslyckanden. Kontrollera alltid det andra returvärdet.

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

OpenResty-alternativet

För icke-blockerande I/O i LuaJIT i produktion är OpenRestys cosockets betydligt mer kraftfulla och snabbare. Använd luasocket för fristående skript och enkla verktyg.

Fråga om icke-blockerande läge

Vad gör tcp:settimeout(0)?

Sammanfattning: Icke-blockerande I/O

Använd settimeout(0) för icke-blockerande socketar och socket.select för I/O-multiplexering. Kombinera med korutiner: yielda vid timeout och återuppta när data är redo. För högpresterande asynkron I/O bör OpenResty eller luv föredras.

Gratis att börja

Lär dig Lua med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
40
Lektioner
159

Vanliga frågor

Är lektionen ”Icke-blockerande I/O med luasocket” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Icke-blockerande I/O med luasocket”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Icke-blockerande I/O med luasocket”?

Använd luasocket i icke-blockerande läge, integrerat med en korutinschemaläggare. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Lua Academy?

Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Icke-blockerande I/O med luasocket”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Lua Academy-lektionen?

Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Bygga en enkel händelseloop
  2. Async/await med korutiner
  3. Promise-liknande mönster
  4. Icke-blockerande I/O med luasocket
← Tillbaka till Lua Academy