0Pricing
Lua Academy · Lektion

Einen Client erstellen

Fordern Sie Daten von einem Server an.

Einen Client erstellen ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.

Lebenszyklus eines Clients

Ein TCP-Client durchläuft einen klaren Lebenszyklus: Socket erstellen, mit einem Server verbinden, Daten austauschen und anschließend schließen.

In LuaSocket besteht jeder Schritt aus einem Methodenaufruf, und jeder kann fehlschlagen. Ein gut geschriebener Client prüft jeden Rückgabewert und räumt seinen Socket auf jedem Fehlerpfad auf.

local socket = require("socket")
local client = assert(socket.tcp())

Sicher verbinden

Legen Sie vor dem Aufruf von connect ein Verbindungs-Timeout fest, damit ein nicht erreichbarer Host Ihr Programm nicht blockiert. Einige Sekunden sind üblich.

Wenn connect nil zurückgibt, protokollieren Sie den Fehler und brechen Sie ab. Gehen Sie niemals davon aus, dass der Handshake erfolgreich war.

client:settimeout(5)
local ok, err = client:connect("127.0.0.1", 8080)
if not ok then
  client:close()
  error("connect failed: " .. err)
end

socket.connect verwenden

Für den häufigsten Anwendungsfall fasst socket.connect(host, port) die Erstellung und den Verbindungsaufbau zusammen. Die Funktion gibt ein fertiges Clientobjekt oder nil und einen Fehler zurück.

Diese Form ist zwar kurz, gibt Ihnen aber keine Möglichkeit, vor dem Handshake ein Timeout zu setzen. Für unzuverlässige Netzwerke sollten Sie daher die ausführliche Form bevorzugen.

local socket = require("socket")
local client, err = socket.connect("example.com", 13)
if not client then error(err) end

Eine Anfrage senden

Sobald die Verbindung besteht, schreiben Sie die Anfrage-Bytes mit send. Viele Textprotokolle begrenzen Zeilen mit Wagenrücklauf + Zeilenvorschub (\r\n).

Da TCP ein Bytestrom ist, müssen Sie jede logische Nachricht eindeutig abschließen, damit der Server weiß, wo sie endet.

local msg = "PING\r\n"
local sent, err = client:send(msg)
if not sent then error("send failed: " .. err) end

Eine Antwortzeile lesen

Lesen Sie bei zeilenbasierten Protokollen in einer Schleife mit dem Muster "*l". Jeder Aufruf gibt eine Zeile ohne ihren Abschluss zurück.

Bei nil prüfen Sie den Fehler: "closed" bedeutet, dass der Server die Verbindung beendet hat, während "timeout" bedeutet, dass nicht rechtzeitig Daten eingetroffen sind.

client:settimeout(5)
local line, err = client:receive("*l")
if line then
  print("server said:", line)
else
  print("recv error:", err)
end

Eine vollständige Antwort lesen

Anfrage-/Antwortprotokolle lesen häufig alles, bis der Server die Verbindung schließt. Verwenden Sie "*a", um den vollständigen Body zu erfassen.

Wenn Sie Ihre Sendeseite zuerst mit shutdown("send") halb schließen, erkennt der Server das Eingabeende und kann seine Antwort fertigstellen.

client:send("GET DATA\r\n")
client:shutdown("send")
local body, err = client:receive("*a")
print(#(body or ""), "bytes received")

Framing mit fester Länge

Binärprotokolle stellen jeder Nachricht häufig ihre Länge voran. Lesen Sie zuerst den Längen-Header und anschließend genau so viele Bytes.

Wenn Sie eine Zahl an receive übergeben, wartet der Aufruf, bis diese Anzahl an Bytes eingetroffen ist oder ein Socketfehler auftritt. So erhalten Sie ein präzises Framing über den Bytestrom.

local header = client:receive(4)
local len = string.unpack(">I4", header)
local payload = client:receive(len)

Ein vollständiger Echo-Client

Hier ist der vollständige Ablauf: verbinden, eine Zeile senden, die zurückgesendete Zeile lesen und schließen. Dies ist die typische Struktur eines LuaSocket-Clients.

Beachten Sie, dass jeder potenziell fehlschlagende Aufruf der Kürze halber mit assert abgesichert wird. Ein echter Client würde Fehler jedoch angemessen behandeln.

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()

Verbindungsabbrüche behandeln

Server können Verbindungen jederzeit trennen. Ein send an einen geschlossenen Kommunikationspartner kann nil, "closed" zurückgeben, und receive gibt die unvollständigen Daten zusammen mit dem Fehler zurück.

Behandeln Sie "closed" als normalen Endzustand und nicht als Absturz. Die Logik zum Wiederverbinden gehört in eine Wiederholungsfunktion um den Client.

local data, err, partial = client:receive("*a")
if err == "closed" then
  print("peer closed, got", #partial, "bytes")
end

Nicht blockierende Clients

Setzen Sie das Timeout auf 0, um einen vollständig nicht blockierenden Client zu erhalten. Die Aufrufe kehren dann sofort zurück und signalisieren mit "timeout", dass kein Fortschritt möglich ist.

Kombinieren Sie dies mit socket.select, um effizient auf die Bereitschaft vieler Sockets zu warten, ohne Busy-Waiting zu verwenden.

client:settimeout(0)
local r = socket.select({client}, nil, 5)
if #r > 0 then print(client:receive("*l")) end

Hostnamen auflösen

Wenn Sie eine Verbindung über einen Hostnamen herstellen, löst LuaSocket diesen für Sie auf. Um die Auflösung zu untersuchen oder zwischenzuspeichern, rufen Sie selbst socket.dns.toip oder socket.dns.getaddrinfo auf.

Wenn Sie den Namen einmal auflösen und anschließend über die IP-Adresse verbinden, vermeiden Sie wiederholte DNS-Abfragen in einer engen Wiederverbindungsschleife.

local socket = require("socket")
local ip = assert(socket.dns.toip("example.com"))
local c = assert(socket.connect(ip, 80))

Kurzer Test

Wählen Sie die richtige Methode, um alles zu lesen, was ein Server sendet, bis er die Verbindung schließt.

Zusammenfassung

Sie haben einen TCP-Client vollständig erstellt: mit einem Timeout verbinden, Anfragen strukturieren und senden, Antworten zeilenweise, anhand der Byteanzahl oder als vollständigen Datenstrom lesen und die Verbindung sauber schließen.

Sie haben außerdem die Behandlung von Verbindungsabbrüchen, den nicht blockierenden Modus mit select und das Zwischenspeichern von DNS-Auflösungen kennengelernt. Als Nächstes schreiben Sie die Serverseite, die auf diese Clients antwortet.

Häufig gestellte Fragen

Ist die Lektion „Einen Client erstellen“ kostenlos?

Ja — der vollständige Text von „Einen Client erstellen“ 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 „Einen Client erstellen“?

Fordern Sie Daten von einem Server an. 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 2 von 4.

Wie lange dauert die Lektion „Einen Client erstellen“?

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