0Pricing
Lua Academy · Lektion

Einen Server erstellen

Akzeptieren Sie eingehende Verbindungen.

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

Ein TCP-Server bindet sich an eine Adresse, lauscht auf Verbindungen und nimmt anschließend in einer Schleife Verbindungen an, um Clients zu bedienen.

In LuaSocket erstellen Sie mit socket.tcp() ein Masterobjekt, machen es mit bind/listen zu einem lauschenden Server und holen mit accept Clients aus der Warteschlange.

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

An einen Port binden

server:bind(host, port) reserviert eine lokale Adresse. Verwenden Sie "*" oder "0.0.0.0", um Verbindungen an jeder Schnittstelle anzunehmen, oder "127.0.0.1", um nur lokale Verbindungen zuzulassen.

Das Binden schlägt mit "address already in use" fehl, wenn ein anderer Prozess den Port belegt.

server:setoption("reuseaddr", true)
local ok, err = server:bind("*", 8080)
if not ok then error("bind failed: " .. err) end

Auf Clients lauschen

server:listen(backlog) versetzt den Socket in den passiven Modus und beginnt, eingehende Handshakes in eine Warteschlange einzureihen. Der Backlog bezeichnet die maximale Anzahl ausstehender Verbindungen.

Die Kurzform socket.bind(host, port, backlog) führt Binden und Lauschen in einem Aufruf aus und gibt ein fertiges Serverobjekt zurück.

local socket = require("socket")
local server = assert(socket.bind("*", 8080, 32))
print("listening on", server:getsockname())

Eine Verbindung annehmen

server:accept() blockiert, bis sich ein Client verbindet, und gibt dann ein brandneues TCP-Clientobjekt für diesen Kommunikationspartner zurück. Der Server-Socket selbst lauscht weiter.

Bei einem Socket mit Timeout gibt accept nil, "timeout" zurück. So können Sie zwischendurch andere Aufgaben erledigen.

local client, err = server:accept()
if client then
  print("client from", client:getpeername())
end

Einen Client bedienen

Behandeln Sie das von accept zurückgegebene Objekt genau wie einen Client-Socket: Empfangen Sie Anfragen mit receive und senden Sie Antworten mit send.

Geben Sie dem Socket jedes einzelnen Clients ein eigenes Timeout, damit ein langsamer Client nicht den gesamten Server blockiert.

client:settimeout(10)
local line = client:receive("*l")
if line then client:send(line .. "\n") end
client:close()

Die Accept-Schleife

Ein klassischer iterativer Server läuft endlos: einen Client annehmen, ihn bedienen, ihn schließen und wiederholen. So wird jeweils nur ein Client verarbeitet.

Das ist einfach und korrekt, kann aber keine gleichzeitigen Clients bedienen, da eine langsame Anfrage alle dahinter wartenden Clients blockiert.

while true do
  local c = server:accept()
  if c then
    local msg = c:receive("*l")
    if msg then c:send(msg .. "\r\n") end
    c:close()
  end
end

Ein minimaler Echo-Server

Zusammengesetzt bindet und lauscht ein Echo-Server und sendet anschließend in einer Schleife die erste Zeile jedes Clients zurück.

Dies ist der kleinste vollständige LuaSocket-Server und ein sinnvolles Ziel für den zuvor erstellten Client.

local socket = require("socket")
local s = assert(socket.bind("*", 8080))
while true do
  local c = s:accept()
  c:send((c:receive("*l") or "") .. "\r\n")
  c:close()
end

Nebenläufigkeit mit select

Um viele Clients gleichzeitig und ohne Threads zu bedienen, verwenden Sie socket.select. Die Funktion gibt die Sockets zurück, die zum Lesen bereit sind, einschließlich des lauschenden Servers, wenn ein neuer Client wartet.

Sie verwalten eine Tabelle aktiver Clients und verarbeiten nur diejenigen, für die Daten vorliegen. Dadurch bleibt eine ereignisbasierte Schleife mit nur einem Thread reaktionsfähig.

local readable = socket.select(watch, nil, 1)
for _, sock in ipairs(readable) do
  if sock == server then
    table.insert(watch, server:accept())
  end
end

Nicht blockierendes Annehmen

Setzen Sie server:settimeout(0), damit accept niemals blockiert. Kombinieren Sie dies mit select, sodass Sie accept nur aufrufen, wenn der Listener tatsächlich lesebereit ist.

Dies ist die Grundlage eines skalierbaren Einzelprozess-Servers, der Hunderte von Verbindungen multiplexen kann.

server:settimeout(0)
local ready = socket.select({server}, nil, 5)
if #ready > 0 then
  local c = server:accept()
end

Clientfehler behandeln

Clients können Verbindungen abrupt trennen. Wenn receive nil, "closed" oder einen unvollständigen Puffer zurückgibt, entfernen Sie diesen Client aus Ihrer Überwachungstabelle und schließen Sie seinen Socket.

Lassen Sie niemals zu, dass eine fehlerhafte Verbindung die Accept-Schleife beendet. Isolieren Sie die Fehler jedes einzelnen Clients.

local data, err = client:receive("*l")
if err == "closed" then
  client:close()
  remove_from_watch(client)
end

Sauberes Herunterfahren

Beenden Sie beim Herunterfahren zunächst das Annehmen neuer Verbindungen, schließen Sie jeden aktiven Client-Socket und anschließend den lauschenden Server, um den Port freizugeben.

Wenn Sie beim Binden reuseaddr setzen, können Sie sofort neu starten, ohne die TCP-Phase TIME_WAIT abwarten zu müssen.

for _, c in ipairs(clients) do c:close() end
server:close()
print("server stopped")

Kurzer Test

Wählen Sie die Aufrufreihenfolge, die einen neuen Master-Socket in einen funktionsfähigen Listener verwandelt.

Zusammenfassung

Sie haben einen TCP-Server erstellt: mit reuseaddr binden, mit einem Backlog lauschen und in einer Schleife mit accept Clients bedienen.

Sie haben die einfache iterative Schleife kennengelernt und sie anschließend mit socket.select für nicht blockierende Nebenläufigkeit skaliert, einschließlich Fehlerisolierung und sauberem Herunterfahren. Als Nächstes wechseln Sie zu HTTP.

Häufig gestellte Fragen

Ist die Lektion „Einen Server erstellen“ kostenlos?

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

Akzeptieren Sie eingehende Verbindungen. 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 3 von 4.

Wie lange dauert die Lektion „Einen Server 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