TCP Temelleri
Bağlanıp veri gönderin.
TCP Temelleri, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. 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.
LuaSocket Nedir?
LuaSocket, Lua için fiilî ağ kitaplığıdır. Ham TCP ve UDP soketlerinin yanı sıra HTTP, SMTP ve FTP için daha üst düzey yardımcılar sunar.
Harici bir C modülüdür; bu nedenle standart Lua'nın parçası değildir. LuaRocks aracılığıyla yükleyip require ile yüklemelisiniz.
Bu kurstaki kod parçalarının hiçbiri, ağla iletişim kurdukları için basit bir çalışma alanında çalışmaz.
local socket = require("socket")
print(socket._VERSION)TCP Soketi Oluşturma
Temel nesne, socket.tcp() ile oluşturulan TCP ana soketidir. Yeni oluşturulan ana soket bağlantısız ve bağlanmamış durumdadır.
Bir ana soketten connect kullanarak onu istemci nesnesine dönüştürebilir veya bind+listen kullanarak sunucu nesnesine dönüştürebilirsiniz.
Çoğu çağrı ya bir değer ya da nil ile birlikte bir hata dizesi döndürür; bu nedenle her ikisini de daima yakalayın.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) endAdres Ailesi
TCP, IPv4 veya IPv6 üzerinden çalışır. socket.tcp() adres ailesini gerektiğinde seçerken socket.tcp4() ve socket.tcp6() belirli bir aileyi zorunlu kılar.
Açık bir denetim gerekiyorsa bağlanmadan önce bir ana bilgisayar adını sayısal adrese çözümlemek için socket.dns.toip(host) kullanın.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)Bir Konağa Bağlanma
conn:connect(host, port) TCP'nin üç aşamalı el sıkışmasını gerçekleştirir. Başarılı olduğunda 1, başarısız olduğunda ise nil ve "connection refused" veya "timeout" gibi bir hata iletisi döndürür.
Kolaylık sağlayan socket.connect(host, port) işlevi, tek bir çağrıda soket oluşturup bağlanır.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) endVeri Gönderme
conn:send(data) sokete bayt yazar. Gönderilen son baytın indisini döndürür. Engellemeli bir sokette bu genellikle data değerinin tam uzunluğudur.
TCP bir ileti protokolü değil, bayt akışıdır; bu nedenle tek bir send çağrısı ağ üzerinden bölünebilir veya başka verilerle birleştirilebilir. İletileriniz için çerçevelemeyi kendiniz yapmalısınız.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)Veri Alma
conn:receive(pattern) akıştan okur. Varsayılan "*l" deseni, satır sonu karakteri olmadan bir satır okur. "*a" ise bağlantı kapanana kadar okur.
Belirli sayıda bayt okumak için bir sayı da aktarabilirsiniz. Hata durumunda nil, bir hata dizesi ve alınan kısmi verileri döndürür.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")Bağlantıyı Kapatma
İşiniz bittiğinde dosya tanımlayıcısını serbest bırakmak ve bir TCP FIN göndermek için daima conn:close() çağrısını yapın.
Karşı tarafın yanıtını okumaya devam ederken akışın sonunu bildirmek için conn:shutdown("send") ile bağlantıyı tek yönlü kapatabilirsiniz. Bu, "*a" kullanan istek/yanıt protokolleri için kullanışlıdır.
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()Zaman Aşımları Önemlidir
Varsayılan olarak soketler süresiz şekilde engellenir. conn:settimeout(seconds) bir çağrının ne kadar bekleyeceğini sınırlar. 0 değeri soketi engellemesiz yapar.
Zaman aşımı gerçekleştiğinde çağrı nil ve "timeout" dizesini döndürür. Yanıt vermeyen bağlantılardan kaçınmak için üretim ortamında daima bir zaman aşımı ayarlayın.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP ve UDP
TCP bağlantı odaklı, sıralı ve güvenilirdir: El sıkışmalar ve yeniden iletimler karşılığında baytlar bir kez ve sıralı olarak ulaşır.
UDP (socket.udp()) bağlantısız ve güvenilmezdir, ancak ek yükü düşüktür; telemetri veya oyunlar için uygundur. Bu kursta HTTP'nin temelini oluşturduğu için TCP'ye odaklanılmaktadır.
Kısmi Gönderimler ve Döngüler
Engellemesiz soketlerde send arabelleğinizin yalnızca bir bölümünü iletebilir. İşlem, nil, "timeout" ve şimdiye kadar yazılan son baytın dizinini döndürür.
Sağlam bir gönderici, tüm arabellek boşaltılana kadar son gönderilen baytı izleyen bayttan devam ederek döngüye girer.
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
endBağlantıyı İnceleme
conn:getpeername() uzak IP'yi ve portu, conn:getsockname() ise yerel ucu döndürür. Bunlar günlük kaydı ve hata ayıklama için kullanışlıdır.
conn:setoption("keepalive", true) ve conn:setoption("tcp-nodelay", true) temel soketin davranışını ayarlar.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)Hızlı Kontrol
TCP alma semantiği anlayışınızı sınayın.
Özet
LuaSocket'in TCP ana nesnesini tanıdınız; soketleri oluşturmayı, bağlamayı, veri göndermeyi, veri almayı ve kapatmayı öğrendiniz; zaman aşımlarının ve yarı kapatmanın davranışı nasıl şekillendirdiğini gördünüz.
TCP'nin bir bayt akışı olduğunu, her çağrının nil, err döndürebileceğini ve üretim ortamındaki bir soketin her zaman zaman aşımı ayarlaması gerektiğini unutmayın. Sırada bu parçaları çalışan bir istemcide birleştireceksiniz.
Sıkça Sorulan Sorular
“TCP Temelleri” dersi ücretsiz mi?
Evet — “TCP Temelleri” 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.
“TCP Temelleri” dersinde ne öğreneceğim?
Bağlanıp veri gönderin. 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 1. dersidir.
“TCP Temelleri” 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