0Pricing
Lua Academy · Lekcja

Nieblokujące wejście-wyjście z luasocket

Proszę używać luasocket w trybie nieblokującym, zintegrowanym z schedulerem korutyn.

Nieblokujące wejście-wyjście z luasocket to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Czym jest luasocket

luasocket to biblioteka Lua udostępniająca gniazda TCP/UDP oraz klienty HTTP, FTP i SMTP. Domyślnie działa w trybie blokującym; tryb nieblokujący umożliwia asynchroniczną obsługę I/O.

Instalowanie luasocket

Zainstaluj bibliotekę za pomocą LuaRocks: luarocks install luasocket. Załaduj ją w swoim skrypcie.

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

Tworzenie gniazda TCP

Utwórz gniazdo klienta TCP i połącz je z serwerem.

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))

Tryb nieblokujący

Ustaw gniazdo w tryb nieblokujący za pomocą tcp:settimeout(0). Odczyty i zapisy zwracają wynik natychmiast wraz z błędem przekroczenia limitu czasu, jeśli żadne dane nie są gotowe.

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

Integracja z korutynami

Połącz nieblokujące gniazda z korutynami: wykonuj yield, gdy dane nie są gotowe, i wznawiaj korutynę, gdy selektor zasygnalizuje gotowość.

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) zwraca zbiory gniazd gotowych do operacji I/O — to podstawa prawidłowej pętli zdarzeń.

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

Klient HTTP

luasocket zawiera wysokopoziomowy moduł HTTP do wykonywania prostych żądań.

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

Gniazda UDP

UDP jest bezpołączeniowy. Użyj socket.udp() do komunikacji opartej na datagramach.

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

Limity czasu

Ustaw limit czasu za pomocą :settimeout(seconds). Limit czasu równy 0 oznacza tryb nieblokujący; liczba dodatnia pozwala na częściowe blokowanie; nil oznacza blokowanie bezterminowe.

Schemat obsługi błędów

Funkcje luasocket zwracają nil oraz ciąg znaków z błędem w przypadku niepowodzenia. Zawsze sprawdzaj drugą zwracaną wartość.

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

Alternatywa w postaci OpenResty

W przypadku produkcyjnego, nieblokującego I/O w LuaJIT cosockets OpenResty są znacznie bardziej funkcjonalne i wydajne. Używaj luasocket w samodzielnych skryptach i prostych narzędziach.

Pytanie dotyczące trybu nieblokującego

Co robi tcp:settimeout(0)?

Podsumowanie: nieblokujące I/O

Używaj settimeout(0) dla nieblokujących gniazd oraz socket.select do multipleksowania I/O. Połącz je z korutynami: wykonuj yield po przekroczeniu limitu czasu i wznawiaj korutynę, gdy dane będą gotowe. W przypadku wysokowydajnego asynchronicznego I/O preferuj OpenResty lub luv.

Często zadawane pytania

Czy lekcja „Nieblokujące wejście-wyjście z luasocket” jest bezpłatna?

Tak — pełny tekst „Nieblokujące wejście-wyjście z luasocket” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Nieblokujące wejście-wyjście z luasocket”?

Proszę używać luasocket w trybie nieblokującym, zintegrowanym z schedulerem korutyn. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Nieblokujące wejście-wyjście z luasocket”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie prostej pętli zdarzeń
  2. Async/Await z korutynami
  3. Wzorce podobne do Promise
  4. Nieblokujące wejście-wyjście z luasocket
← Powrót do Lua Academy