Sunucu Oluşturma
Gelen bağlantıları kabul edin.
Sunucu Oluşturma, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
Sunucu Yaşam Döngüsü
Bir TCP sunucusu bir adrese bind işlemiyle bağlanır, bağlantıları dinler ve ardından istemcileri kabul edip hizmet vermek üzere döngüye girer.
LuaSocket'te socket.tcp() ile bir ana soket oluşturur, bunu bind/listen ile dinleyen bir sunucuya dönüştürür ve istemcileri kuyruktan accept ile alırsınız.
local socket = require("socket")
local server = assert(socket.tcp())Bir Porta Bind Etme
server:bind(host, port) yerel bir adresi ayırır. Her ağ arayüzünden bağlantı kabul etmek için "*" veya "0.0.0.0", yalnızca yerel bağlantılar için "127.0.0.1" kullanın.
Başka bir işlem portu kullanıyorsa bind işlemi "address already in use" hatasıyla başarısız olur.
server:setoption("reuseaddr", true)
local ok, err = server:bind("*", 8080)
if not ok then error("bind failed: " .. err) endİstemçileri Dinleme
server:listen(backlog) soketi pasif duruma getirir ve gelen el sıkışmaları kuyruğa almaya başlar. backlog, bekleyen bağlantıların en yüksek sayısıdır.
Kısayol olan socket.bind(host, port, backlog), bind ve listen işlemlerini tek çağrıda gerçekleştirerek kullanıma hazır bir sunucu nesnesi döndürür.
local socket = require("socket")
local server = assert(socket.bind("*", 8080, 32))
print("listening on", server:getsockname())Bağlantı Kabul Etme
server:accept(), bir istemci bağlanana kadar bekler ve ardından o eş için yepyeni bir TCP istemci nesnesi döndürür. Sunucu soketinin kendisi dinlemeye devam eder.
Zaman aşımı ayarlanmış bir sunucu soketinde accept, nil, "timeout" döndürür; bu da araya başka işler eklemenizi sağlar.
local client, err = server:accept()
if client then
print("client from", client:getpeername())
endTek İstemciye Hizmet Verme
accept işleminden sonra döndürülen nesneyi tıpkı bir istemci soketi gibi ele alın: İstekler için receive, yanıtlar için send kullanın.
Yavaş bir istemcinin tüm sunucuyu durdurmaması için istemci başına sokete kendine ait bir zaman aşımı verin.
client:settimeout(10)
local line = client:receive("*l")
if line then client:send(line .. "\n") end
client:close()Kabul Döngüsü
Klasik yinelemeli bir sunucu sonsuza kadar döngüye girer: bir istemciyi kabul eder, ona hizmet verir, bağlantısını kapatır ve tekrarlar. Bu yapı aynı anda tek bir istemciyi ele alır.
Basit ve doğru olsa da eş zamanlı istemcilere hizmet veremez; çünkü yavaş bir istek arkasındaki herkesi engeller.
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
endMinimal Bir Yankı Sunucusu
Parçaları birleştirirsek yankı sunucusu bind işlemi yapar, dinler ve ardından her istemcinin ilk satırını geri yankılayan bir döngüye girer.
Bu, en küçük eksiksiz LuaSocket sunucusudur ve daha önce oluşturduğunuz istemci için kullanışlı bir hedeftir.
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()
endselect ile Eş Zamanlılık
İş parçacıkları kullanmadan aynı anda birçok istemciye hizmet vermek için socket.select kullanın. Bu işlev, yeni bir istemcinin beklediği durumdaki dinleme sunucusu da dahil olmak üzere okumaya hazır soketleri döndürür.
Etkin istemcileri içeren bir tabloyu yönetir ve yalnızca verisi olanları işlersiniz; böylece tek iş parçacıklı olay döngüsü yanıt vermeyi sürdürür.
local readable = socket.select(watch, nil, 1)
for _, sock in ipairs(readable) do
if sock == server then
table.insert(watch, server:accept())
end
endEngellemesiz Kabul
server:settimeout(0) ayarını yaparak accept işleminin hiç beklememesini sağlayın. Bunu select ile eşleştirin; böylece accept çağrısını yalnızca dinleyici gerçekten okunabilir olduğunda yaparsınız.
Bu, yüzlerce bağlantıyı çoğullayan ölçeklenebilir, tek işlemlik bir sunucunun temelidir.
server:settimeout(0)
local ready = socket.select({server}, nil, 5)
if #ready > 0 then
local c = server:accept()
endİstemci Hatalarını Ele Alma
İstemciler bağlantıyı aniden kesebilir. receive nil, "closed" veya kısmi bir arabellek döndürdüğünde bu istemciyi izleme tablonuzdan çıkarın ve soketini kapatın.
Tek bir bozuk bağlantının kabul döngüsünü durdurmasına asla izin vermeyin; her istemcinin hatalarını birbirinden yalıtın.
local data, err = client:receive("*l")
if err == "closed" then
client:close()
remove_from_watch(client)
endDüzgün Kapatma
Kapatma sırasında yeni bağlantıları kabul etmeyi durdurun, etkin istemci soketlerinin her birini kapatın ve ardından portu serbest bırakmak için dinleyen sunucuyu kapatın.
Bind işlemi sırasında reuseaddr ayarlamak, TCP TIME_WAIT süresinin dolmasını beklemeden hemen yeniden başlatmanıza olanak tanır.
for _, c in ipairs(clients) do c:close() end
server:close()
print("server stopped")Hızlı Kontrol
Yeni oluşturulmuş bir ana soketi çalışan bir dinleyiciye dönüştüren çağrı sırasını seçin.
Özet
Bir TCP sunucusu oluşturdunuz: reuseaddr ile bind işlemi yaptınız, backlog ile dinlediniz ve istemcilere hizmet vermek için accept üzerinde döngüye girdiniz.
Basit yinelemeli döngüyü, ardından engellemesiz eş zamanlılık için socket.select ile ölçeklendirmeyi; ayrıca hata yalıtımını ve düzgün kapatmayı gördünüz. Sırada HTTP'ye geçeceksiniz.
Sıkça Sorulan Sorular
“Sunucu Oluşturma” dersi ücretsiz mi?
Evet — “Sunucu Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Sunucu Oluşturma” dersinde ne öğreneceğim?
Gelen bağlantıları kabul edin. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Sunucu Oluşturma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- TCP Temelleri
- İstemci Oluşturma
- Sunucu Oluşturma
- HTTP İstekleri