Lua Academy · leksjon

Bygg en server

Godta innkommende tilkoblinger.

Leksjon 3 av 413 trinn

Bygg en server er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Serverens livssyklus

En TCP-server binder seg til en adresse, lytter etter tilkoblinger og går deretter i en løkke som godtar og betjener klienter.

I LuaSocket oppretter du en master med socket.tcp(), gjør den om til en lyttende server med bind/listen, og henter klienter fra køen med accept.

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

Binde til en port

server:bind(host, port) reserverer en lokal adresse. Bruk "*" eller "0.0.0.0" for å godta tilkoblinger på alle grensesnitt, eller "127.0.0.1" for kun lokale tilkoblinger.

Bind mislykkes med "address already in use" hvis en annen prosess bruker porten.

server:setoption("reuseaddr", true)
local ok, err = server:bind("*", 8080)
if not ok then error("bind failed: " .. err) end

Lytte etter klienter

server:listen(backlog) setter socketen i passiv modus og begynner å legge innkommende håndtrykk i kø. Backlog er det maksimale antallet tilkoblinger som kan vente.

Kortformen socket.bind(host, port, backlog) utfører bind og listen i ett kall og returnerer et klart serverobjekt.

local socket = require("socket")
local server = assert(socket.bind("*", 8080, 32))
print("listening on", server:getsockname())

Godta en tilkobling

server:accept() blokkerer til en klient kobler til, og returnerer deretter et helt nytt TCP-klientobjekt for denne motparten. Selve serversocketen fortsetter å lytte.

På en serversocket med tidsavbrudd returnerer accept nil, "timeout", slik at du kan utføre annet arbeid innimellom.

local client, err = server:accept()
if client then
  print("client from", client:getpeername())
end

Betjene én klient

Etter accept behandler du det returnerte objektet akkurat som en klientsocket: receive-forespørsler og send-svar.

Gi hver klientsocket sitt eget tidsavbrudd, slik at én treg klient ikke kan blokkere hele serveren.

client:settimeout(10)
local line = client:receive("*l")
if line then client:send(line .. "\n") end
client:close()

Accept-løkken

En klassisk iterativ server går i en uendelig løkke: godta en klient, betjen den, lukk den og gjenta. Dette håndterer én klient om gangen.

Det er enkelt og korrekt, men serveren kan ikke betjene samtidige klienter, fordi en treg forespørsel blokkerer alle som står bak den.

while true do
  local c = server:accept()
  if c then
    local msg = c:receive("*l")
    if msg then c:send(msg .. "\r\n") end
    c:close()
  end
end

En minimal ekkoserver

Når delene settes sammen, binder en ekkoserver seg til en adresse, lytter og går deretter i en løkke som sender hver klients første linje tilbake som ekko.

Dette er den minste komplette LuaSocket-serveren og et nyttig mål for klienten du bygget tidligere.

local socket = require("socket")
local s = assert(socket.bind("*", 8080))
while true do
  local c = s:accept()
  c:send((c:receive("*l") or "") .. "\r\n")
  c:close()
end

Samtidighet med select

Bruk socket.select for å betjene mange klienter samtidig uten tråder. Metoden returnerer socketene som er klare for lesing, inkludert lytteserveren når en ny klient venter.

Du administrerer en tabell over aktive klienter og behandler bare dem som har data, slik at en hendelsesløkke med én tråd forblir responsiv.

local readable = socket.select(watch, nil, 1)
for _, sock in ipairs(readable) do
  if sock == server then
    table.insert(watch, server:accept())
  end
end

Ikke-blokkerende accept

Angi server:settimeout(0) slik at accept aldri blokkerer. Kombiner dette med select, slik at du bare kaller accept når lytteren faktisk er lesbar.

Dette er grunnlaget for en skalerbar server i én prosess som multiplekserer hundrevis av forbindelser.

server:settimeout(0)
local ready = socket.select({server}, nil, 5)
if #ready > 0 then
  local c = server:accept()
end

Håndtere klientfeil

Klienter kan koble fra brått. Når receive returnerer nil, "closed" eller en delvis buffer, fjerner du klienten fra overvåkingstabellen og lukker socketen.

La aldri én ødelagt forbindelse ta ned accept-løkken; isoler feilene til hver enkelt klient.

local data, err = client:receive("*l")
if err == "closed" then
  client:close()
  remove_from_watch(client)
end

Kontrollert avslutning

Ved avslutning slutter du å godta nye tilkoblinger, lukker alle aktive klientsocketer og lukker deretter lytteserveren for å frigjøre porten.

Hvis du setter reuseaddr ved binding, kan du starte på nytt umiddelbart uten å vente ut TCP-perioden TIME_WAIT.

for _, c in ipairs(clients) do c:close() end
server:close()
print("server stopped")

Rask kontroll

Velg rekkefølgen på kallene som gjør en ny master-socket om til en fungerende lytter.

Oppsummering

Du har bygget en TCP-server: bundet med reuseaddr, lyttet med en backlog og brukt en løkke med accept for å betjene klienter.

Du har sett den enkle iterative løkken og deretter skalert den med socket.select for ikke-blokkerende samtidighet, i tillegg til feilisolering og kontrollert avslutning. Deretter skal du gå videre til HTTP.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Bygg en server» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Bygg en server», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Bygg en server»?

Godta innkommende tilkoblinger. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Bygg en server»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Grunnleggende TCP
  2. Bygg en klient
  3. Bygg en server
  4. HTTP-forespørsler
← Tilbake til Lua Academy