Bases de TCP
Connectez-vous et envoyez des données.
Bases de TCP est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.
Qu’est-ce que LuaSocket ?
LuaSocket est la bibliothèque réseau de référence pour Lua. Elle expose des sockets TCP et UDP bruts, ainsi que des outils de niveau supérieur pour HTTP, SMTP et FTP.
Il s’agit d’un module C externe, qui ne fait donc pas partie de Lua standard. Installez-le avec LuaRocks et chargez-le avec require.
Aucun extrait de ce cours ne s’exécute dans un simple bac à sable, car les extraits accèdent au réseau.
local socket = require("socket")
print(socket._VERSION)Créer un socket TCP
L’objet central est le socket TCP principal, créé avec socket.tcp(). Un socket principal fraîchement créé n’est ni connecté ni associé à une adresse.
Depuis un socket principal, vous pouvez soit utiliser connect (pour le transformer en objet client), soit utiliser bind+listen (pour le transformer en objet serveur).
La plupart des appels renvoient soit une valeur, soit nil accompagné d’une chaîne d’erreur ; capturez donc toujours les deux.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endLa famille d’adresses
TCP fonctionne avec IPv4 ou IPv6. socket.tcp() choisit la famille à la demande, tandis que socket.tcp4() et socket.tcp6() en imposent une.
Utilisez socket.dns.toip(host) pour résoudre un nom d’hôte en adresse numérique avant la connexion si vous avez besoin d’un contrôle explicite.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Se connecter à un hôte
conn:connect(host, port) effectue la poignée de main TCP en trois étapes. En cas de réussite, il renvoie 1 ; en cas d’échec, il renvoie nil et un message d’erreur comme "connection refused" ou "timeout".
La fonction pratique socket.connect(host, port) crée un socket et s’y connecte en un seul appel.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endEnvoyer des données
conn:send(data) écrit des octets dans le socket. Il renvoie l’index du dernier octet envoyé. Avec un socket bloquant, il s’agit généralement de la longueur complète de data.
TCP est un flux d’octets, et non un protocole de messages ; un seul appel à send peut donc être divisé ou regroupé sur le réseau. Vous devez définir vous-même la structure de vos messages.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Recevoir des données
conn:receive(pattern) lit le flux. Le motif par défaut "*l" lit une ligne sans le saut de ligne. "*a" lit jusqu’à la fermeture de la connexion.
Vous pouvez également transmettre un nombre pour lire exactement ce nombre d’octets. En cas d’erreur, la fonction renvoie nil, une chaîne d’erreur et toutes les données partielles reçues.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Fermer la connexion
Appelez toujours conn:close() lorsque vous avez terminé afin de libérer le descripteur de fichier et d’envoyer un FIN TCP.
Vous pouvez effectuer une fermeture partielle avec conn:shutdown("send") pour signaler la fin du flux tout en continuant à lire la réponse du pair. C’est pratique pour les protocoles de requête-réponse utilisant "*a".
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()Les délais d’attente sont importants
Par défaut, les sockets bloquent indéfiniment. conn:settimeout(seconds) limite la durée d’attente d’un appel. Une valeur de 0 rend le socket non bloquant.
Lorsqu’un délai d’attente se déclenche, l’appel renvoie nil et la chaîne "timeout". Définissez toujours un délai d’attente en production afin d’éviter les connexions bloquées.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP ou UDP
TCP est orienté connexion, ordonné et fiable : les octets arrivent une seule fois et dans le bon ordre, au prix de poignées de main et de retransmissions.
UDP (socket.udp()) est sans connexion et non fiable, mais léger, ce qui le rend adapté à la télémétrie ou aux jeux. Ce cours se concentre sur TCP, car il est à la base de HTTP.
Envois partiels et boucles
Avec des sockets non bloquants, send peut ne transmettre qu'une partie de votre tampon. Il renvoie nil, "timeout" et l'index du dernier octet écrit jusque-là.
Un émetteur robuste effectue une boucle en reprenant à l'octet qui suit le dernier octet envoyé, jusqu'à ce que le tampon entier soit vidé.
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
endInspecter la connexion
conn:getpeername() renvoie l'adresse IP et le port distants, tandis que conn:getsockname() renvoie l'extrémité locale. Ces informations sont utiles pour la journalisation et le débogage.
conn:setoption("keepalive", true) et conn:setoption("tcp-nodelay", true) permettent d'ajuster le comportement du socket sous-jacent.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Vérification rapide
Testez votre compréhension de la réception avec TCP.
Récapitulatif
Vous avez découvert l'objet maître TCP de LuaSocket, appris à créer, connecter, utiliser pour envoyer et recevoir, puis fermer des sockets, et vu comment les délais d'attente et la fermeture partielle influencent le comportement.
Retenez que TCP est un flux d'octets, que chaque appel peut renvoyer nil, err et qu'un socket utilisé en production définit toujours un délai d'attente. Vous allez maintenant assembler ces éléments pour créer un client fonctionnel.
Questions Fréquemment Posées
La leçon « Bases de TCP » est-elle gratuite ?
Oui — le texte complet de « Bases de TCP » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Bases de TCP » ?
Connectez-vous et envoyez des données. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Lua Academy ?
Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Bases de TCP » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?
Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.