Grundlæggende TCP
Opret forbindelse, og send data.
Grundlæggende TCP er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 1 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.
Hvad er LuaSocket
LuaSocket er de facto-netværksbiblioteket til Lua. Det stiller rå TCP- og UDP-sockets samt hjælpefunktioner på højere niveau til HTTP, SMTP og FTP til rådighed.
Det er et eksternt C-modul og er derfor ikke en del af standard-Lua. Du installerer det via LuaRocks og indlæser det med require.
Ingen af kodestumperne i dette kursus kan køre i et almindeligt øvelsesmiljø, fordi de har kontakt med netværket.
local socket = require("socket")
print(socket._VERSION)Oprettelse af en TCP-socket
Kerneobjektet er TCP-master-socketen, som oprettes med socket.tcp(). En ny master-socket er hverken forbundet eller bundet.
Fra en master-socket kan du enten bruge connect og gøre den til et klientobjekt eller bruge bind+listen og gøre den til et serverobjekt.
De fleste kald returnerer enten en værdi eller nil samt en fejlstreng, så du skal altid gemme begge.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endAdressefamilien
TCP fungerer over IPv4 eller IPv6. socket.tcp() vælger adressefamilien efter behov, mens socket.tcp4() og socket.tcp6() tvinger brugen af én bestemt familie.
Brug socket.dns.toip(host) til at omsætte et værtsnavn til en numerisk adresse før forbindelsen, hvis du har brug for eksplicit kontrol.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Forbindelse til en vært
conn:connect(host, port) udfører TCP's trevejs-håndtryk. Ved succes returnerer den 1; ved fejl returnerer den nil og en fejlmeddelelse som "connection refused" eller "timeout".
Hjælpefunktionen socket.connect(host, port) opretter en socket og forbinder den i ét kald.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endAfsendelse af data
conn:send(data) skriver bytes til socketen. Den returnerer indekset for den sidst sendte byte. Med en blokerende socket er det normalt hele længden af data.
TCP er en bytestream og ikke en meddelelsesprotokol, så en enkelt send kan blive opdelt eller slået sammen under overførslen. Du skal selv indramme dine meddelelser.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Modtagelse af data
conn:receive(pattern) læser fra datastrømmen. Standardmønsteret "*l" læser én linje uden linjeskiftet. "*a" læser, indtil forbindelsen lukkes.
Du kan også angive et tal for at læse præcis det antal bytes. Ved fejl returnerer den nil, en fejlstreng og eventuelle delvise data, der er modtaget.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Lukning af forbindelsen
Kald altid conn:close(), når du er færdig, for at frigive fildeskriptoren og sende et TCP FIN.
Du kan lukke forbindelsen i senderetningen med conn:shutdown("send") for at signalere slutningen på datastrømmen, mens du stadig læser modpartens svar. Det er praktisk til anmodnings-/svarprotokoller, der bruger "*a".
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()Tidsgrænser er vigtige
Som standard blokerer sockets for evigt. conn:settimeout(seconds) begrænser, hvor længe et kald venter. En værdi på 0 gør socketen ikke-blokerende.
Når tidsgrænsen udløses, returnerer kaldet nil og strengen "timeout". Sæt altid en tidsgrænse i produktionsmiljøet for at undgå fastlåste forbindelser.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP kontra UDP
TCP er forbindelsesorienteret, ordnet og pålidelig: bytes ankommer én gang og i den rigtige rækkefølge, men det koster håndtryk og genudsendelser.
UDP (socket.udp()) er forbindelsesløs og upålidelig, men ressourcelet og velegnet til telemetri eller spil. Dette kursus fokuserer på TCP, fordi det danner grundlag for HTTP.
Delvise afsendelser og løkker
På ikke-blokerende sockets kan send muligvis kun sende en del af din buffer. Den returnerer nil, "timeout" og indekset for den sidste byte, der hidtil er skrevet.
En robust afsender bruger en løkke og fortsætter fra byten efter den sidste sendte, indtil hele bufferen er tømt.
local i = 1
while i <= #data do
local sent, err, last = conn:send(data, i)
i = (sent or last) + 1
if err and err ~= "timeout" then break end
endUndersøgelse af forbindelsen
conn:getpeername() returnerer den eksterne IP-adresse og port, mens conn:getsockname() returnerer den lokale ende. De hjælper med logning og fejlfinding.
conn:setoption("keepalive", true) og conn:setoption("tcp-nodelay", true) finjusterer den underliggende sockets adfærd.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Hurtigt tjek
Afprøv din forståelse af TCP's modtagelsessemantik.
Opsummering
Du har mødt TCP-hovedobjektet i LuaSocket, lært at oprette, forbinde, sende, modtage og lukke sockets samt set, hvordan tidsudløb og halv-lukning påvirker adfærden.
Husk, at TCP er en bytestream, at hvert kald kan returnere nil, err, og at en produktionssocket altid skal have en tidsgrænse. Næste gang samler du disse dele til en fungerende klient.
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 “Grundlæggende TCP” gratis?
Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Grundlæggende TCP”, 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 “Grundlæggende TCP”?
Opret forbindelse, og send data. 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 1 af 4.
Hvor lang tid tager lektionen “Grundlæggende TCP”?
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