- Katılım
- 5 Haz 2025
- Mesajlar
- 11
- Tepkime puanı
- 6
- Puanları
- 3
Socket Programlama Başlangıcı
Socket programlama, iki veya daha fazla bilgisayarın ağ üzerinden birbiriyle iletişim kurmasını sağlayan temel programlama konularından biridir.Özellikle:
- Oyun sunucuları
- Chat uygulamaları
- Web servisleri
- Dosya transferi
- Uzaktan kontrol sistemleri
- IoT uygulamaları
- Gerçek zamanlı iletişim
Socket mantığını anlamak, ağ programlamaya başlamak isteyen biri için oldukça önemlidir. Çünkü internet üzerinde çalışan birçok sistemin temelinde istemci ve sunucu arasında veri alışverişi bulunur.
Socket Nedir?
Socket, iki sistem arasında ağ üzerinden veri alışverişi yapılmasını sağlayan iletişim noktasıdır.Basit şekilde düşünürsek:
Bir program veri gönderir, diğer program bu veriyi alır.
Bu iletişim belirli:
- IP adresleri
- Port numaraları
- Protokoller
Bir socket bağlantısı genellikle iki taraf arasında kurulur:
- Client
- Server
Client Nedir?
Client yani istemci, sunucuya bağlanan taraftır.Örneğin:
- Oyun istemcisi
- Web tarayıcısı
- Mobil uygulama
- Masaüstü programı
Örneğin bir MMORPG oyununu açtığınızda oyun istemcisi oyun sunucusuna bağlantı kurar.
Server Nedir?
Server yani sunucu, belirli bir port üzerinde bağlantı bekleyen taraftır.Client bağlandığında bağlantıyı kabul eder ve veri alışverişi başlar.
Örneğin oyun sunucusu:
- Oyuncu girişlerini
- Karakter hareketlerini
- Chat mesajlarını
- Eşya işlemlerini
IP Adresi Nedir?
IP adresi, ağ üzerindeki cihazın adresidir.Örneğin yerel ağda:
192.168.1.10
gibi bir IP kullanılabilir.
İnternet üzerindeki sunucularda ise public IP kullanılır.
Client'ın sunucuya bağlanabilmesi için genellikle:
Sunucu IP adresi + Port
bilinmelidir.
Port Nedir?
Port, aynı IP adresi üzerinde çalışan farklı servisleri birbirinden ayırmaya yarar.Bir sunucuda aynı anda:
- Web sunucusu
- Oyun sunucusu
- Veritabanı
- SSH
Hepsinin IP adresi aynı olabilir ancak farklı port kullanırlar.
Örneğin yaygın portlardan bazıları:
- HTTP → 80
- HTTPS → 443
- SSH → 22
- MySQL → 3306
Ancak özel uygulamalarda geliştirici istediği uygun portu kullanabilir.
IP ve Port Birlikte Nasıl Çalışır?
IP adresi hangi bilgisayara bağlanılacağını belirler.Port ise o bilgisayarda hangi uygulamaya bağlanılacağını belirler.
Basit şekilde:
IP → Bina
Port → Binadaki oda
gibi düşünülebilir.
TCP Nedir?
TCP:Transmission Control Protocol
anlamına gelir.
Bağlantı odaklı bir protokoldür.
Client ile server arasında önce bağlantı kurulur.
Daha sonra veri güvenilir şekilde aktarılır.
TCP'nin önemli özelliklerinden biri verinin:
- Sırasını koruması
- Kaybolan paketleri yeniden göndermesi
- Bağlantı durumunu takip etmesi
TCP Nerede Kullanılır?
Özellikle veri kaybının kabul edilemediği sistemlerde kullanılır.Örneğin:
- Web
- Dosya transferi
- Login sistemleri
- Chat
- Veritabanı bağlantıları
Oyunlarda da birçok kritik veri için TCP tercih edilebilir.
UDP Nedir?
UDP:User Datagram Protocol
anlamına gelir.
TCP'den farklı olarak bağlantısız çalışır.
Paket gönderilir ancak karşı tarafın paketi kesin aldığı garanti edilmez.
Bu nedenle daha hızlı ve daha hafif olabilir.
UDP Nerede Kullanılır?
Özellikle gerçek zamanlı sistemlerde kullanılabilir.Örneğin:
- Online oyunlar
- Sesli görüşme
- Video iletişimi
- Canlı veri akışı
Çünkü bazı durumlarda eski bir paketin tekrar gönderilmesi anlamsız olabilir.
TCP ile UDP Arasındaki Fark
Genel olarak:TCP
- Güvenilir
- Paket sırası korunur
- Bağlantı kurulur
- Daha fazla kontrol mekanizması vardır
UDP
- Daha hafif
- Daha hızlı olabilir
- Paket kaybı mümkündür
- Bağlantı kurma zorunluluğu yoktur
Oyunlarda TCP mi UDP mi?
Tek bir cevap yoktur.Oyunun yapısına göre ikisi birlikte bile kullanılabilir.
Örneğin:
TCP
- Login
- Envanter
- Chat
- Market işlemleri
UDP
- Oyuncu konumu
- Hareket
- Gerçek zamanlı combat verisi
Ancak oyun mimarisine göre bu yapı değişebilir.
Socket Programlama Nasıl Çalışır?
Temel mantık iki taraflıdır.Sunucu:
- Socket oluşturur.
- Bir IP/port üzerine bağlanır.
- Bağlantı dinlemeye başlar.
- Client bağlantısını kabul eder.
- Veri alır ve gönderir.
- Socket oluşturur.
- Sunucunun IP ve portuna bağlanır.
- Veri gönderir.
- Sunucudan veri alır.
Listen Nedir?
Sunucunun belirli bir port üzerinde yeni bağlantıları beklemesi anlamına gelir.Server:
“Bu porttan gelecek bağlantıları dinliyorum.”
demiş olur.
Client bağlantı talebi gönderdiğinde sunucu bunu kabul edebilir.
Accept Nedir?
Sunucunun gelen client bağlantısını kabul etmesidir.Bir client bağlandığında yeni bir iletişim kanalı oluşur.
Sunucu bu bağlantı üzerinden client ile veri alışverişi yapabilir.
Connect Nedir?
Client tarafının sunucuya bağlantı kurmak için yaptığı işlemdir.Client:
- IP adresini
- Port numarasını
Sunucu açık değilse veya port erişilebilir değilse bağlantı başarısız olabilir.
Send ve Receive Nedir?
Socket bağlantısı kurulduktan sonra iki taraf veri gönderip alabilir.Genel mantık:
Send → Veri gönder
Receive → Veri al
şeklindedir.
Ancak gerçek socket programlamada bu işlemlerin düşündüğünüz kadar basit olmadığı bazı önemli noktalar vardır.
Socket Veriyi Mesaj Olarak mı Gönderir?
TCP kullanıldığında önemli noktalardan biri budur.TCP:
Mesaj tabanlı değil, stream tabanlıdır.
Yani gönderdiğiniz iki ayrı mesaj karşı tarafta iki ayrı receive çağrısında gelmek zorunda değildir.
Örneğin siz:
- Merhaba
- Dünya
Karşı taraf bunları tek parça veya birkaç parçaya bölünmüş şekilde alabilir.
Bu nedenle uygulamanın kendi mesaj formatını oluşturması gerekir.
Paket Sistemi Nedir?
Socket uygulamalarında verilerin anlamlandırılması için uygulama seviyesinde paket formatı oluşturulabilir.Bir paket içerisinde örneğin:
- Paket türü
- Uzunluk
- Kullanıcı ID
- Mesaj içeriği
Bu sayede karşı taraf gelen verinin ne olduğunu anlayabilir.
Packet Header Nedir?
Paketin başında bulunan kontrol bilgileridir.Örneğin header içerisinde:
- Paket ID
- Paket uzunluğu
- Versiyon
- İşlem türü
Gerçek oyun sunucularında packet header oldukça yaygındır.
Paket Uzunluğu Neden Önemlidir?
TCP stream olduğu için karşı taraf mesajın nerede başlayıp nerede bittiğini bilmelidir.Bu nedenle paketin başında uzunluk bilgisi gönderilebilir.
Alıcı önce header'ı okur.
Daha sonra belirtilen miktarda veriyi bekler.
Serialization Nedir?
Program içerisindeki bir veri yapısının ağ üzerinden gönderilebilecek formata dönüştürülmesidir.Örneğin bir oyuncu bilgisinde:
- ID
- İsim
- Level
- HP
Bu bilgiler ağ üzerinden byte dizisine dönüştürülebilir.
Karşı taraf veriyi tekrar kendi veri yapısına çevirebilir.
Byte Neden Önemli?
Socket'ler temelde byte verisi gönderir.Program içerisinde metin, sayı veya nesne kullanıyor olsanız bile ağ üzerinden gönderilirken bunların byte formatına dönüştürülmesi gerekir.
Bu nedenle socket programlamada:
- Byte
- Encoding
- Binary data
Encoding Nedir?
Metnin byte dizisine ve tekrar metne dönüştürülme yöntemidir.Özellikle Türkçe gibi karakterlerin bulunduğu sistemlerde doğru encoding seçimi önemlidir.
Genellikle:
UTF-8
modern sistemlerde güvenli tercihlerden biridir.
Yanlış encoding kullanılırsa:
- ğ
- ş
- ü
- ö
- ç
- ı
Client ve Server Aynı Encoding Kullanmalı mı?
Evet.Bir taraf UTF-8 ile gönderip diğer taraf farklı bir encoding ile çözmeye çalışırsa karakter bozulmaları oluşabilir.
Bu nedenle iletişim protokolü içerisinde encoding standardı belirlenmelidir.
Endianness Nedir?
Sayıların byte sırasının nasıl tutulduğunu ifade eder.İki temel yaklaşım:
- Little Endian
- Big Endian
Farklı platformlar arasında binary veri gönderirken bu konu önem kazanabilir.
Ağ protokollerinde standart byte sırasına dikkat edilmelidir.
Network Byte Order Nedir?
Ağ protokollerinde sayısal verilerin belirli bir byte sırasıyla gönderilmesini ifade eder.Genellikle:
Big Endian
ile ilişkilendirilir.
Farklı mimariler arasında uyumluluk için önemlidir.
Blocking Socket Nedir?
Bir socket işlemi tamamlanana kadar thread'in beklemesidir.Örneğin receive çağrısı veri gelene kadar bekleyebilir.
Bu durumda thread başka iş yapamaz.
Basit uygulamalarda kullanılabilir ancak çok sayıda client bulunan sunucularda verimsiz olabilir.
Non-Blocking Socket Nedir?
Socket işleminin thread'i uzun süre bloke etmemesini sağlayan çalışma yaklaşımıdır.Özellikle yüksek bağlantı sayısı bulunan sunucularda tercih edilebilir.
Async Socket Nedir?
Socket işlemlerinin asenkron şekilde yapılmasıdır.Örneğin sunucu binlerce client'ın verisini beklerken her kullanıcı için ayrı thread oluşturmak zorunda kalmayabilir.
Bu nedenle modern ağ uygulamalarında:
Async I/O
oldukça önemlidir.
Her Client İçin Bir Thread Mantıklı mı?
Küçük uygulamalarda çalışabilir.Örneğin:
10 kullanıcı
için her bağlantıya ayrı thread basit olabilir.
Ancak:
10.000 kullanıcı
olduğunda 10.000 thread oluşturmak ciddi kaynak tüketebilir.
Bu nedenle yüksek ölçekli sunucularda:
- Async I/O
- Thread Pool
- Event-driven sistemler
Connection Pool Nedir?
Genellikle veritabanı ve bazı ağ sistemlerinde önceden oluşturulmuş bağlantıların tekrar kullanılmasını sağlar.Her işlemde yeni bağlantı açıp kapatmak yerine mevcut bağlantılar kullanılabilir.
Bu performansı artırabilir.
Keep-Alive Nedir?
Bağlantının her işlemden sonra kapatılmak yerine açık tutulmasıdır.Bu sayede sürekli:
- Bağlan
- Veri gönder
- Kapat
Özellikle sık iletişim kurulan uygulamalarda avantajlıdır.
Timeout Nedir?
Bir ağ işleminin ne kadar süre bekleneceğini belirler.Örneğin client sunucuya bağlanmaya çalışıyor ancak sunucu cevap vermiyor.
Program sonsuza kadar beklememelidir.
Belirli süre sonunda:
Timeout
oluşturulabilir.
Timeout Neden Önemli?
Ağ bağlantıları her zaman güvenilir değildir.- Sunucu kapanabilir.
- İnternet kopabilir.
- Firewall paketi engelleyebilir.
- Routing problemi olabilir.
Connection Lost Nasıl Anlaşılır?
Bağlantı koptuğunda:- Receive başarısız olabilir.
- Send başarısız olabilir.
- Socket kapanabilir.
- Timeout oluşabilir.
Reconnect Sistemi Nedir?
Client'ın bağlantı koptuğunda otomatik olarak yeniden sunucuya bağlanmaya çalışmasıdır.Özellikle:
- Oyunlar
- Chat uygulamaları
- Gerçek zamanlı sistemler
Ancak sürekli çok hızlı reconnect denemesi yapmak sunucuyu gereksiz zorlayabilir.
Reconnect Süresi Nasıl Olmalı?
Örneğin başarısız bağlantı sonrası:- 1 saniye
- 2 saniye
- 5 saniye
- 10 saniye
Bu yaklaşıma:
Exponential Backoff
benzeri stratejiler denilebilir.
Heartbeat Nedir?
Client ile server'ın hâlâ bağlı olduğunu kontrol etmek için belirli aralıklarla küçük paketler gönderilmesidir.Örneğin:
Ping
paketi gönderilir.
Karşı taraf:
Pong
cevabı verir.
Uzun süre cevap gelmezse bağlantı kopmuş kabul edilebilir.
Ping Nedir?
Genel ağ anlamındaki ICMP ping ile uygulama seviyesindeki ping aynı şey olmak zorunda değildir.Socket programında geliştirici kendi:
- Ping
- Pong
Bu yöntem bağlantı durumunu kontrol etmek için kullanılabilir.
Latency Nedir?
Bir verinin bir noktadan diğerine ulaşması için geçen süredir.Genellikle:
ms
ile ölçülür.
Özellikle online oyunlarda düşük latency önemlidir.
Ancak socket kodu kötü tasarlanmışsa internet hızlı olsa bile uygulama gecikmeli çalışabilir.
Packet Loss Nedir?
Gönderilen paketlerden bazılarının hedefe ulaşmamasıdır.TCP kaybolan veriyi yeniden gönderdiği için bunu uygulama çoğu zaman doğrudan görmez.
UDP'de ise packet loss uygulama tarafından yönetilebilir.
Jitter Nedir?
Paketlerin ulaşma sürelerinin sürekli değişmesidir.Örneğin:
- Bir paket 20 ms
- Diğeri 80 ms
- Sonraki 30 ms
Özellikle sesli görüşme ve online oyunlarda önemlidir.
Firewall Socket Bağlantısını Engeller mi?
Evet.Sunucunun kullandığı port firewall üzerinde kapalıysa client bağlanamayabilir.
Bu nedenle sunucu kurulurken:
- İşletim sistemi firewall'u
- Router
- Cloud firewall
- Veri merkezi firewall'u
Port Açmak Ne Demektir?
Belirli bir porta dışarıdan gelen bağlantılara izin vermektir.Örneğin sunucunuz belirli bir TCP portunda oyun servisi çalıştırıyorsa o port firewall üzerinde izinli olmalıdır.
Ancak ihtiyaç olmayan portların açılması güvenlik açısından doğru değildir.
NAT Nedir?
Yerel ağdaki özel IP adreslerinin internet üzerinde ortak public IP üzerinden iletişim kurmasını sağlayan yapıdır.Ev kullanıcılarında oldukça yaygındır.
Örneğin bilgisayar:
192.168.x.x
adresine sahip olabilir.
Ancak internette modeminizin public IP adresi görünür.
Port Forwarding Nedir?
İnternetten modeminizin belirli portuna gelen bağlantının yerel ağdaki belirli cihaza yönlendirilmesidir.Örneğin ev bilgisayarınızda test sunucusu çalıştırıyorsanız port forwarding gerekebilir.
Ancak güvenlik riskleri nedeniyle yalnızca ihtiyaç duyulan portlar açılmalıdır.
Localhost Nedir?
Aynı bilgisayarın kendisini ifade eder.Yaygın adres:
127.0.0.1
şeklindedir.
Socket programlamayı öğrenirken ilk testler localhost üzerinde yapılabilir.
Bu sayede iki ayrı bilgisayar gerekmeyebilir.
0.0.0.0 Ne Demektir?
Sunucu tarafında tüm uygun ağ arayüzlerinden bağlantı kabul edilmesini ifade etmek için kullanılabilir.Ancak uygulamanın hangi IP üzerinde dinlediği güvenlik açısından önemlidir.
Sadece yerel erişim isteniyorsa doğrudan herkese açık interface üzerinde dinlemek gereksiz olabilir.
IPv4 ve IPv6
Socket programlama hem IPv4 hem IPv6 ile yapılabilir.IPv4 örneği:
192.168.1.10
IPv6 adresleri ise çok daha uzun bir yapıya sahiptir.
Modern ağ uygulamalarında mümkünse IPv6 desteği de düşünülmelidir.
DNS Nedir?
Domain adını IP adresine çeviren sistemdir.Örneğin kullanıcı:
server.example.com
adresine bağlanabilir.
DNS bu adresin hangi IP'ye karşılık geldiğini bulur.
Bu sayede uygulama içerisinde sabit IP kullanmak zorunda kalmayabilirsiniz.
DNS Kullanmak Neden Avantajlı?
Sunucunun IP adresi değişirse client yazılımını güncellemek yerine DNS kaydı değiştirilebilir.Özellikle üretim sistemlerinde domain kullanımı daha esnektir.
Socket Güvenliği Neden Önemli?
Ağ üzerinden gelen veriye güvenilmemelidir.Client şu tür veriler gönderebilir:
- Bozuk paket
- Aşırı uzun veri
- Beklenmeyen paket tipi
- Sahte kullanıcı bilgisi
Client'a Güvenilir mi?
Özellikle oyun geliştirmede:Hayır.
Client kullanıcının bilgisayarındadır.
Değiştirilebilir veya manipüle edilebilir.
Bu nedenle kritik kontroller sunucu tarafında yapılmalıdır.
Örneğin client:
“Benim 999.999 altınım var.”
dedi diye sunucu bunu kabul etmemelidir.
Server Authoritative Nedir?
Oyunun kritik kararlarını sunucunun verdiği mimaridir.Örneğin:
- Hasar
- Para
- Envanter
- Karakter seviyesi
- Ticaret
Bu yapı hileleri tamamen engellemese de client'a aşırı güvenilmesini önler.
Veri Doğrulama
Sunucuya gelen her paketin:- Uzunluğu
- Türü
- Değer aralığı
- Kullanıcı yetkisi
Bu hem güvenlik hem de stabilite açısından önemlidir.
Paket Boyutu Sınırlandırılmalı mı?
Evet.Client sınırsız boyutta veri gönderebilirse:
- RAM tüketimi
- CPU tüketimi
- DoS riski
Bu nedenle protokolde maksimum paket boyutları belirlenmelidir.
Flood Nedir?
Bir client'ın sunucuya çok kısa sürede aşırı sayıda paket göndermesidir.Bu kötü niyetli yapılabileceği gibi hatalı client nedeniyle de oluşabilir.
Sunucuda rate limit uygulanabilir.
Rate Limit Nedir?
Belirli süre içerisinde yapılabilecek işlem sayısının sınırlandırılmasıdır.Örneğin bir client saniyede:
1000 login isteği
gönderememelidir.
Rate limit sunucuyu kötüye kullanıma karşı korumaya yardımcı olur.
Şifreler Socket Üzerinden Düz Metin Gönderilir mi?
Gönderilmemelidir.Ağ üzerinden hassas veriler gönderiliyorsa:
- TLS
- Güvenli kimlik doğrulama
- Uygun şifreleme
Sadece kendi özel paket formatınızı kullanmanız veriyi güvenli hale getirmez.
TLS Nedir?
Ağ iletişimini şifreleyen güvenlik protokolüdür.HTTPS'in temelinde de TLS bulunur.
Socket tabanlı özel uygulamalarda uygun şekilde TLS kullanılabilir.
Bu sayede ağ trafiğinin üçüncü kişiler tarafından okunması veya değiştirilmesi daha zor hale gelir.
Şifreleme ile Encoding Aynı mı?
Hayır.Örneğin Base64:
Şifreleme değildir.
Sadece veriyi farklı bir gösterim formatına dönüştürür.
Gerçek güvenlik için modern kriptografik yöntemler kullanılmalıdır.
Socket Programlama Nerelerde Kullanılır?
Oyunlar
Client-server iletişimi.Chat Uygulamaları
Gerçek zamanlı mesajlaşma.Web Sistemleri
HTTP de temelinde ağ socket'leri üzerinden çalışır.IoT
Cihazların sunucularla iletişimi.Dosya Transferi
İki sistem arasında veri aktarımı.Remote Administration
Uzak sistem yönetimi.WebSocket Socket ile Aynı mı?
Tam olarak değil.WebSocket, web uygulamalarında istemci ile sunucu arasında sürekli çift yönlü iletişim sağlayan daha üst seviye bir protokoldür.
Tarayıcı tabanlı:
- Chat
- Canlı bildirim
- Oyun
- Dashboard
HTTP ile Socket Arasındaki Fark
HTTP bir uygulama katmanı protokolüdür.Alt seviyede genellikle TCP bağlantılarından yararlanır.
Ham socket programlama yaparken uygulama protokolünü kendiniz tasarlamanız gerekir.
HTTP kullanırken ise büyük bölümü standart olarak hazırdır.
Socket Programlamaya Yeni Başlayan Biri TCP ile mi Başlamalı?
Genellikle evet.TCP:
- Paket kaybı
- Sıralama
- Yeniden gönderim
Bu nedenle socket mantığını öğrenmek için TCP ile basit client-server uygulaması yapmak daha kolaydır.
UDP daha sonra öğrenilebilir.
İlk Proje Ne Olmalı?
En iyi başlangıç projelerinden biri:Basit Chat Uygulaması
olabilir.
Sunucu:
- Bağlantıları kabul eder.
- Mesajları alır.
- Diğer kullanıcılara gönderir.
- Sunucuya bağlanır.
- Mesaj gönderir.
- Gelen mesajları gösterir.
İkinci Proje: Dosya Transferi
Bir client sunucuya dosya gönderebilir.Bu projede:
- Dosya boyutu
- Paketleme
- Progress
- Bağlantı kopması
Üçüncü Proje: Basit Oyun Sunucusu
Basit bir oyuncu sistemi yapılabilir.Örneğin sunucu:
- Oyuncuyu bağlar.
- Kullanıcı adı alır.
- Oyuncu konumunu tutar.
- Diğer oyunculara konum gönderir.
Packet ID Mantığı
Uygulamanızda farklı veri türlerini birbirinden ayırmak için packet ID sistemi oluşturulabilir.Örneğin protokol içerisinde:
- Login paketi
- Chat paketi
- Hareket paketi
- Logout paketi
Alıcı packet ID'ye bakarak hangi işlemin yapılacağını belirler.
Protocol Nedir?
Client ve server'ın hangi formatta iletişim kuracağını belirleyen kurallar bütünüdür.Örneğin:
- Hangi paket türleri var?
- Alanların sırası nedir?
- Veri boyutu nedir?
- Hangi encoding kullanılıyor?
- Hangi cevap ne zaman veriliyor?
Kendi Protokolünü Tasarlamak Zor mu?
Basit sistemde kolay görünebilir.Ancak sistem büyüdükçe:
- Versiyonlama
- Güvenlik
- Hata yönetimi
- Paket uyumluluğu
Bu nedenle protokol daha başlangıçta düzenli tasarlanmalıdır.
Protocol Version Nedir?
Client ve server sürümlerinin uyumlu olup olmadığını anlamak için kullanılabilir.Örneğin eski client yeni sunucunun paket formatını anlamıyorsa bağlantı reddedilebilir.
Bu özellikle oyunlarda oldukça önemlidir.
Backward Compatibility Nedir?
Yeni sunucunun eski client'larla veya yeni client'ın eski protokolle çalışmaya devam edebilmesidir.Her projede gerekli değildir.
Ancak büyük sistemlerde protokol güncellemeleri yapılırken önem kazanabilir.
Socket Logları Neden Önemlidir?
Ağ problemleri bazen tekrar oluşturulması zor hatalardır.Bu nedenle loglarda:
- Bağlanan IP
- Bağlantı zamanı
- Disconnect nedeni
- Paket türü
- Hata mesajı
Ancak şifre ve token gibi hassas bilgiler loglanmamalıdır.
Socket Hataları Nasıl Ele Alınmalı?
Ağ bağlantısında hata normaldir.Örneğin:
- Client interneti kesilebilir.
- Sunucu kapanabilir.
- Paket yarım kalabilir.
- Timeout oluşabilir.
Bağlantı hiçbir zaman kopmayacakmış gibi
tasarlanmamalıdır.
Graceful Disconnect Nedir?
Bağlantının kontrollü şekilde kapatılmasıdır.Client çıkarken sunucuya bilgi gönderebilir.
Sunucu:
- Oyuncuyu listeden çıkarır.
- Kaynakları temizler.
- Socket'i kapatır.
Resource Leak Olabilir mi?
Evet.Socket bağlantıları düzgün kapatılmazsa:
- Açık bağlantılar
- Thread'ler
- Bellek
- Dosya descriptor'ları
Bu nedenle bağlantı kapanırken kaynakların düzgün temizlenmesi önemlidir.
File Descriptor Nedir?
Linux ve Unix benzeri sistemlerde açık socket'ler de dosya benzeri descriptor'lar üzerinden temsil edilebilir.Her process'in açık descriptor sayısı için sistem limitleri olabilir.
Çok yüksek bağlantı sayısında bu limitler önem kazanır.
Sunucu Kaç Bağlantı Kaldırabilir?
Tek bir sayı vermek mümkün değildir.Şunlara bağlıdır:
- Kod mimarisi
- CPU
- RAM
- İşletim sistemi
- Ağ kapasitesi
- Paket miktarı
- Veritabanı yükü
Ancak bağlantı sayısı tek başına performansı belirlemez.
10.000 Client Bağlanması ile 10.000 Aktif Client Aynı mı?
Hayır.10.000 bağlantı açık olabilir ancak saniyede çok az veri gönderebilir.
Başka sistemde yalnızca 1000 client bulunabilir ancak her biri çok yoğun paket gönderiyor olabilir.
Gerçek yük:
Bağlantı sayısı + Paket sıklığı + İşlem maliyeti
ile değerlendirilmelidir.
Veritabanı İşlemleri Socket Thread'inde Yapılmalı mı?
Uzun süren veritabanı sorgusunu doğrudan network işleme akışında bekletmek sunucuyu yavaşlatabilir.Büyük sistemlerde:
- Network
- Game logic
- Database
Bu multi-thread ve async tasarım konularıyla doğrudan bağlantılıdır.
Socket Programlamada Yapılan Yaygın Hatalar
TCP'yi Mesaj Tabanlı Sanmak
TCP stream tabanlıdır.Tek Receive ile Bütün Paket Gelir Sanmak
Garanti değildir.Client'a Güvenmek
Güvenlik problemi oluşturur.Paket Boyutunu Kontrol Etmemek
DoS ve bellek sorunlarına neden olabilir.Timeout Kullanmamak
Bağlantılar sonsuza kadar bekleyebilir.Disconnect Durumunu Yönetmemek
Kaynak sızıntısı oluşabilir.Her Client İçin Sınırsız Thread Oluşturmak
Sunucuyu ölçeklemeyi zorlaştırabilir.Şifreleri Düz Metin Göndermek
Ciddi güvenlik sorunudur.Encoding'i Belirlememek
Türkçe ve diğer karakterler bozulabilir.Log Tutmamak
Ağ sorunlarının teşhisini zorlaştırır.Socket Programlama Öğrenme Sırası
Yeni başlayan biri şu sırayla ilerleyebilir:- IP adresi
- Port
- Client ve Server
- TCP
- UDP
- Connect / Listen / Accept mantığı
- Send / Receive
- Byte ve Encoding
- Paket sistemi
- Header ve paket uzunluğu
- Timeout
- Disconnect / Reconnect
- Heartbeat
- Async Socket
- Multi-Client Server
- Thread Safety
- Güvenlik
- TLS
- Rate Limit
- Sunucu optimizasyonu
Başlangıç İçin En Mantıklı Yol
Öncelikle localhost üzerinde basit TCP client-server sistemi oluşturmak gerekir.Daha sonra:
- İki bilgisayar arasında test
- Yerel ağ
- Public IP
- Firewall
- Port yönlendirme
Direkt internete açık sunucu geliştirmeye başlamak gereksiz karmaşıklık oluşturabilir.
Pratik Proje Sırası
Proje 1
Tek client + tek server.Amaç bağlantının nasıl kurulduğunu anlamak.
Proje 2
Basit chat sistemi.Amaç çift yönlü veri gönderimini öğrenmek.
Proje 3
Birden fazla client.Amaç bağlantı yönetimini öğrenmek.
Proje 4
Paket sistemi.Amaç farklı mesaj türlerini ayırmak.
Proje 5
Login sistemi.Amaç doğrulama ve güvenlik mantığını öğrenmek.
Proje 6
Basit online oyun.Amaç gerçek zamanlı veri iletişimini öğrenmek.
Socket Programlama Kontrol Listesi
- Client ve server farkını biliyor muyum?
- IP ve port mantığını anlıyor muyum?
- TCP ile UDP farkını biliyor muyum?
- TCP'nin stream tabanlı olduğunu biliyor muyum?
- Paket formatım belirli mi?
- Paket uzunluğunu doğruluyor muyum?
- Encoding standardım belli mi?
- Timeout kullanıyor muyum?
- Disconnect durumunu yönetiyor muyum?
- Reconnect sistemi gerekli mi?
- Heartbeat gerekli mi?
- Her client için sınırsız thread oluşturmuyor muyum?
- Client'tan gelen veriyi doğruluyor muyum?
- Rate limit kullanıyor muyum?
- Hassas veriler şifreleniyor mu?
- Log sistemi var mı?
- Firewall portları doğru mu?
- Gereksiz portlar kapalı mı?
Sonuç
Socket programlama, ağ üzerinden çalışan uygulamaların temelini anlamak için öğrenilmesi gereken en önemli konulardan biridir.Temel mantık:
Client → Sunucuya bağlanır
Server → Bağlantıyı kabul eder
İki taraf → Veri gönderir ve alır
şeklinde özetlenebilir.
Ancak gerçek uygulamalarda yalnızca bağlantı kurmak yeterli değildir.
Ayrıca:
- TCP/UDP seçimi
- Paketleme
- Encoding
- Timeout
- Disconnect
- Reconnect
- Thread/Async yönetimi
- Güvenlik
Yeni başlayan biri için en mantıklı yol önce:
TCP + localhost + basit chat
uygulamasıyla başlamaktır.
Daha sonra çoklu client desteği ve paket sistemine geçilebilir.
Özellikle oyun sunucusu geliştirmek isteyen biri için:
Socket + Multi-thread/Async + Veritabanı + Paket Protokolü + Güvenlik
konuları birlikte öğrenilmelidir.
Kısacası socket programlama yalnızca iki bilgisayar arasında veri göndermek değildir. Sağlam bir sistem geliştirmek için bağlantının kurulmasından kopmasına, paketin doğrulanmasından güvenliğine kadar bütün iletişim sürecinin yönetilmesi gerekir.



