Opbyg en klient
Anmod om data fra en server.
Opbyg en klient er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.
Klientens livscyklus
En TCP-klient følger en klar livscyklus: Opret en socket, forbind til en server, udveksl data, og luk derefter.
I LuaSocket er hvert trin ét metodekald, og hvert kald kan mislykkes. En velskrevet klient kontrollerer alle returværdier og rydder sin socket op ved enhver fejl.
local socket = require("socket")
local client = assert(socket.tcp())Sikker forbindelse
Angiv en tidsgrænse for forbindelsen, før du kalder connect, så en utilgængelig vært ikke får dit program til at hænge. Et par sekunder er typisk.
Hvis connect returnerer nil, skal du logge fejlen og afbryde. Antag aldrig, at håndtrykket lykkedes.
client:settimeout(5)
local ok, err = client:connect("127.0.0.1", 8080)
if not ok then
client:close()
error("connect failed: " .. err)
endBrug af socket.connect
I det almindelige tilfælde samler socket.connect(host, port) oprettelse og forbindelse i ét kald. Den returnerer et klientobjekt, der er klar til brug, eller nil og en fejl.
Det er kortfattet, men giver dig ingen mulighed for at angive en tidsgrænse før håndtrykket, så foretræk den eksplicitte form på ustabile netværk.
local socket = require("socket")
local client, err = socket.connect("example.com", 13)
if not client then error(err) endAfsendelse af en forespørgsel
Når forbindelsen er oprettet, skriver du bytesene i din forespørgsel med send. Mange tekstprotokoller afslutter linjer med vognretur + linjeskift (\r\n).
Da TCP er en strøm, skal du afslutte hver logiske meddelelse tydeligt, så serveren ved, hvor den slutter.
local msg = "PING\r\n"
local sent, err = client:send(msg)
if not sent then error("send failed: " .. err) endLæsning af et linjesvar
For linjebaserede protokoller skal du læse i en løkke med mønsteret "*l". Hvert kald returnerer én linje uden afslutningstegnet.
Ved nil skal du undersøge fejlen: "closed" betyder, at serveren har afbrudt forbindelsen, mens "timeout" betyder, at der ikke kom data i tide.
client:settimeout(5)
local line, err = client:receive("*l")
if line then
print("server said:", line)
else
print("recv error:", err)
endLæsning af et helt svar
Forespørgsels-/svarprotokoller læser ofte alt, indtil serveren lukker forbindelsen. Brug "*a" til at hente hele indholdet.
Hvis du først halv-lukker din sendeside med shutdown("send"), ser serveren slutningen på inddata og kan færdiggøre sit svar.
client:send("GET DATA\r\n")
client:shutdown("send")
local body, err = client:receive("*a")
print(#(body or ""), "bytes received")Indramning med fast længde
Binære protokoller indleder ofte hver meddelelse med dens længde. Læs først længdeheaderen, og læs derefter præcis så mange bytes.
Hvis du sender et tal til receive, blokerer kaldet, indtil det antal bytes er ankommet, eller socketten melder en fejl. Det giver en præcis indramning af bytestreamen.
local header = client:receive(4)
local len = string.unpack(">I4", header)
local payload = client:receive(len)En komplet ekkoklient
Her er hele forløbet: Opret forbindelse, send en linje, læs den ekkede linje, og luk forbindelsen. Dette er den klassiske opbygning af en LuaSocket-klient.
Bemærk, at hvert kald, der kan mislykkes, er beskyttet med assert for korthedens skyld, men en rigtig klient ville håndtere fejl på en ordentlig måde.
local socket = require("socket")
local c = assert(socket.connect("127.0.0.1", 8080))
assert(c:send("hello\r\n"))
print(c:receive("*l"))
c:close()Håndtering af afbrydelser
Servere kan afbryde forbindelser når som helst. En send til en lukket modpart kan returnere nil, "closed", og receive returnerer de delvise data sammen med fejlen.
Behandl "closed" som en normal afsluttende tilstand, ikke som et nedbrud. Genforbindelseslogik hører hjemme i en genforsøgsfunktion omkring klienten.
local data, err, partial = client:receive("*a")
if err == "closed" then
print("peer closed, got", #partial, "bytes")
endIkke-blokerende klienter
Angiv tidsgrænsen til 0 for en fuldstændig ikke-blokerende klient. Kald returnerer derefter med det samme og angiver "timeout", når der ikke er mulighed for fremskridt.
Kombinér dette med socket.select for effektivt at vente på, at mange sockets bliver klar, uden at bruge en aktiv venteløkke.
client:settimeout(0)
local r = socket.select({client}, nil, 5)
if #r > 0 then print(client:receive("*l")) endOpløsning af værtsnavne
Hvis du opretter forbindelse med et værtsnavn, løser LuaSocket det for dig. Hvis du selv vil undersøge eller cache opslaget, kan du kalde socket.dns.toip eller socket.dns.getaddrinfo.
Ved at udføre opslaget én gang og oprette forbindelse med IP-adressen undgår du gentagne DNS-opslag i en tæt genforbindelsesløkke.
local socket = require("socket")
local ip = assert(socket.dns.toip("example.com"))
local c = assert(socket.connect(ip, 80))Hurtigt tjek
Vælg den korrekte måde at læse alt, hvad en server sender, indtil den lukker forbindelsen.
Opsummering
Du har bygget en TCP-klient fra ende til anden: Opret forbindelse med en tidsgrænse, indram og send forespørgsler, læs svar med linjer, byteantal eller hele strømmen, og luk korrekt.
Du har også set håndtering af afbrydelser, ikke-blokerende tilstand med select og DNS-cachelagring. Næste gang skriver du serversiden, som besvarer disse klienter.
Lær Lua med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 40
- Lektioner
- 159
Ofte stillede spørgsmål
Er lektionen “Opbyg en klient” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Opbyg en klient”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Opbyg en klient”?
Anmod om data fra en server. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Lua Academy?
Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Opbyg en klient”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Lua Academy-lektion?
Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Grundlæggende TCP
- Opbyg en klient
- Opbyg en server
- HTTP-forespørgsler