0Pricing
Lua Academy · Lektion

TCP-Grundlagen

Verbinden Sie sich und senden Sie Daten.

TCP-Grundlagen ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist LuaSocket

LuaSocket ist die De-facto-Netzwerkbibliothek für Lua. Sie stellt direkte TCP- und UDP-Sockets sowie höherstufige Hilfsfunktionen für HTTP, SMTP und FTP bereit.

Es handelt sich um ein externes C-Modul und daher nicht um einen Bestandteil des Standardumfangs von Lua. Sie installieren es über LuaRocks und laden es mit require.

Keines der Beispiele in diesem Kurs läuft in einem gewöhnlichen Playground, da sie auf das Netzwerk zugreifen.

local socket = require("socket")
print(socket._VERSION)

Einen TCP-Socket erstellen

Das zentrale Objekt ist der TCP-Master-Socket, der mit socket.tcp() erstellt wird. Ein neuer Master ist weder verbunden noch gebunden.

Von einem Master aus können Sie entweder connect aufrufen, wodurch er zu einem Client-Objekt wird, oder bind+listen, wodurch er zu einem Server-Objekt wird.

Die meisten Aufrufe geben entweder einen Wert oder nil zusammen mit einer Fehlerzeichenkette zurück. Speichern Sie daher immer beide Rückgabewerte.

local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) end

Adressfamilie

TCP funktioniert über IPv4 oder IPv6. socket.tcp() wählt die Adressfamilie verzögert, während socket.tcp4() und socket.tcp6() eine Familie erzwingen.

Verwenden Sie socket.dns.toip(host), um einen Hostnamen vor dem Verbindungsaufbau in eine numerische Adresse aufzulösen, wenn Sie explizite Kontrolle benötigen.

local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)

Mit einem Host verbinden

conn:connect(host, port) führt den TCP-Drei-Wege-Handshake aus. Bei Erfolg wird 1 zurückgegeben, bei einem Fehler nil und eine Fehlermeldung wie "connection refused" oder "timeout".

Die Hilfsfunktion socket.connect(host, port) erstellt einen Socket und verbindet ihn in einem einzigen Aufruf.

local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) end

Daten senden

conn:send(data) schreibt Bytes in den Socket. Die Funktion gibt den Index des letzten gesendeten Bytes zurück. Bei einem blockierenden Socket entspricht dieser normalerweise der vollständigen Länge von data.

TCP ist ein Bytestream und kein Nachrichtenprotokoll. Ein einzelner Aufruf von send kann daher bei der Übertragung aufgeteilt oder mit anderen Daten zusammengeführt werden. Sie müssen Ihre Nachrichten selbst abgrenzen.

local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)

Daten empfangen

conn:receive(pattern) liest aus dem Datenstrom. Das Standardmuster "*l" liest eine Zeile ohne den Zeilenumbruch. "*a" liest, bis die Verbindung geschlossen wird.

Sie können auch eine Zahl übergeben, um genau diese Anzahl an Bytes zu lesen. Bei einem Fehler werden nil, eine Fehlerzeichenkette und alle bis dahin empfangenen unvollständigen Daten zurückgegeben.

local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")

Verbindung schließen

Rufen Sie nach Abschluss immer conn:close() auf, um den Dateideskriptor freizugeben und ein TCP-FIN zu senden.

Mit conn:shutdown("send") können Sie die Verbindung halbseitig schließen. Dadurch signalisieren Sie das Ende des Datenstroms und können weiterhin die Antwort der Gegenstelle lesen. Das ist praktisch für Anfrage-Antwort-Protokolle, die "*a" verwenden.

conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()

Timeouts sind wichtig

Standardmäßig blockieren Sockets unbegrenzt. conn:settimeout(seconds) begrenzt, wie lange ein Aufruf wartet. Der Wert 0 macht den Socket nicht blockierend.

Wenn ein Timeout ausgelöst wird, gibt der Aufruf nil und die Zeichenkette "timeout" zurück. Setzen Sie in der Produktion immer ein Timeout, um hängende Verbindungen zu vermeiden.

conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") end

TCP im Vergleich zu UDP

TCP ist verbindungsorientiert, geordnet und zuverlässig: Bytes kommen genau einmal und in der richtigen Reihenfolge an, allerdings auf Kosten von Handshakes und Neuübertragungen.

UDP (socket.udp()) ist verbindungslos und unzuverlässig, aber leichtgewichtig und eignet sich gut für Telemetrie oder Spiele. Dieser Kurs konzentriert sich auf TCP, da es die Grundlage von HTTP bildet.

Teilübertragungen und Schleifen

Bei nicht blockierenden Sockets überträgt send möglicherweise nur einen Teil Ihres Puffers. Die Funktion liefert nil, "timeout" und den Index des bisher geschriebenen letzten Bytes zurück.

Eine robuste Sendefunktion arbeitet in einer Schleife und setzt ab dem Byte nach dem zuletzt gesendeten fort, bis der gesamte Puffer übertragen ist.

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
end

Die Verbindung untersuchen

conn:getpeername() liefert die entfernte IP-Adresse und den Port, während conn:getsockname() den lokalen Endpunkt zurückgibt. Diese Informationen helfen bei der Protokollierung und beim Debugging.

conn:setoption("keepalive", true) und conn:setoption("tcp-nodelay", true) passen das Verhalten des zugrunde liegenden Sockets an.

local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)

Kurzer Test

Testen Sie Ihr Verständnis der Empfangssemantik von TCP.

Zusammenfassung

Sie haben das TCP-Masterobjekt von LuaSocket kennengelernt, gelernt, Sockets zu erstellen, zu verbinden, Daten zu senden, zu empfangen und zu schließen, und gesehen, wie Timeouts und das Halb-Schließen das Verhalten beeinflussen.

Denken Sie daran: TCP ist ein Bytestrom, jeder Aufruf kann nil, err zurückgeben, und ein Socket in der Produktion setzt immer ein Timeout. Als Nächstes setzen Sie diese Bausteine zu einem funktionsfähigen Client zusammen.

Häufig gestellte Fragen

Ist die Lektion „TCP-Grundlagen“ kostenlos?

Ja — der vollständige Text von „TCP-Grundlagen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „TCP-Grundlagen“?

Verbinden Sie sich und senden Sie Daten. Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „TCP-Grundlagen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. TCP-Grundlagen
  2. Einen Client erstellen
  3. Einen Server erstellen
  4. HTTP-Requests
← Zurück zu Lua Academy