Fondamenti di TCP
Si connetta e invii dati.
Fondamenti di TCP è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Che cos'è LuaSocket?
LuaSocket è la libreria di rete de facto per Lua. Espone socket TCP e UDP a basso livello, oltre a helper di livello superiore per HTTP, SMTP e FTP.
È un modulo C esterno, quindi non fa parte di Lua standard. Lo installi tramite LuaRocks e lo carichi con require.
Nessuno degli snippet di questo corso funziona in un semplice playground, perché interagisce con la rete.
local socket = require("socket")
print(socket._VERSION)Creare un socket TCP
L'oggetto principale è il socket principale TCP, creato con socket.tcp(). Un socket principale appena creato non è connesso né associato a un indirizzo.
Da un socket principale può eseguire connect (trasformandolo in un oggetto client) oppure bind+listen (trasformandolo in un oggetto server).
La maggior parte delle chiamate restituisce un valore oppure nil insieme a una stringa di errore, quindi acquisisca sempre entrambi.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endLa famiglia di indirizzi
TCP funziona su IPv4 o IPv6. socket.tcp() sceglie la famiglia in modo lazy, mentre socket.tcp4() e socket.tcp6() ne impongono una specifica.
Utilizzi socket.dns.toip(host) per risolvere un nome host in un indirizzo numerico prima della connessione, se Le serve un controllo esplicito.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Connettersi a un host
conn:connect(host, port) esegue l'handshake TCP a tre vie. In caso di successo restituisce 1; in caso di errore restituisce nil e un messaggio di errore come "connection refused" o "timeout".
La funzione di utilità socket.connect(host, port) crea un socket e si connette in un'unica chiamata.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endInviare dati
conn:send(data) scrive byte nel socket. Restituisce l'indice dell'ultimo byte inviato. Con un socket bloccante, di solito corrisponde alla lunghezza completa di data.
TCP è un flusso di byte, non un protocollo a messaggi, quindi un singolo send può essere suddiviso o combinato durante il trasferimento. Deve definire autonomamente il framing dei messaggi.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Ricevere dati
conn:receive(pattern) legge dal flusso. Il pattern predefinito "*l" legge una riga senza il carattere di nuova riga. "*a" legge fino alla chiusura della connessione.
Può anche passare un numero per leggere esattamente quel numero di byte. In caso di errore restituisce nil, una stringa di errore ed eventuali dati parziali ricevuti.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Chiudere la connessione
Chiami sempre conn:close() al termine, per rilasciare il descrittore di file e inviare un TCP FIN.
Può chiudere una sola direzione con conn:shutdown("send"), segnalando la fine del flusso ma continuando a leggere la risposta del peer. È utile per i protocolli richiesta-risposta che utilizzano "*a".
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()I timeout sono importanti
Per impostazione predefinita, i socket si bloccano indefinitamente. conn:settimeout(seconds) limita il tempo di attesa di una chiamata. Un valore pari a 0 rende il socket non bloccante.
Quando scade un timeout, la chiamata restituisce nil e la stringa "timeout". Imposti sempre un timeout in produzione per evitare connessioni bloccate.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP e UDP
TCP è orientato alla connessione, ordinato e affidabile: i byte arrivano una sola volta e nell'ordine corretto, al costo di handshake e ritrasmissioni.
UDP (socket.udp()) non richiede una connessione ed è inaffidabile, ma leggero e adatto alla telemetria o ai giochi. Questo corso si concentra su TCP perché è alla base di HTTP.
Invii parziali e cicli
Con i socket non bloccanti, send può trasmettere solo una parte del buffer. Restituisce nil, "timeout" e l'indice dell'ultimo byte scritto fino a quel momento.
Un mittente robusto usa un ciclo e riprende dal byte successivo all'ultimo inviato, finché l'intero buffer non è stato svuotato.
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
endIspezionare la connessione
conn:getpeername() restituisce l'IP e la porta remoti, mentre conn:getsockname() restituisce l'estremità locale. Questi metodi sono utili per la registrazione e il debug.
conn:setoption("keepalive", true) e conn:setoption("tcp-nodelay", true) consentono di configurare il comportamento del socket sottostante.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Verifica rapida
Verifichi la propria comprensione della semantica della ricezione di TCP.
Riepilogo
Ha conosciuto l'oggetto master TCP di LuaSocket, ha imparato a creare, connettere, usare per l'invio e la ricezione e chiudere i socket, e ha visto come timeout e chiusura parziale influenzano il comportamento.
Ricordi che TCP è un flusso di byte, che ogni chiamata può restituire nil, err e che un socket in produzione deve sempre impostare un timeout. Ora riunirà questi elementi per costruire un client funzionante.
Domande Frequenti
La lezione «Fondamenti di TCP» è gratuita?
Sì — il testo completo di «Fondamenti di TCP» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Fondamenti di TCP»?
Si connetta e invii dati. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Fondamenti di TCP»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Fondamenti di TCP
- Costruire un client
- Costruire un server
- Richieste HTTP