Neler yeni
Metin2 Support

Metin2 Dünyasına Hoş Geldiniz! Yeni bir maceraya adım atın ve topluluğumuza katılın. Sorularınızı sormak, deneyimlerinizi paylaşmak ve diğer oyuncularla iletişim kurmak için hemen kaydolun. Kayıt olun, etkileşimde bulunun ve Metin2 dünyasındaki serüveninizi daha da özel hale getirin. Birlikte oynamak için sabırsızlanıyoruz!

Socket Programlama Başlangıcı

ircoas

New member
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
gibi alanlarda kullanılır.

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
üzerinden gerçekleşir.

Bir socket bağlantısı genellikle iki taraf arasında kurulur:

  • Client
  • Server

Socket

Client Nedir?​

Client yani istemci, sunucuya bağlanan taraftır.

Örneğin:

  • Oyun istemcisi
  • Web tarayıcısı
  • Mobil uygulama
  • Masaüstü programı
bir sunucuya bağlanırken client görevi görür.

Ö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
istemcilerden alabilir ve diğer istemcilere bilgi gönderebilir.

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
çalışabilir.

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
şeklindedir.

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
dir.

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ı
TCP kullanabilir.

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ışı
gibi alanlarda tercih edilebilir.

Çü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
şeklinde düşünülebilir.

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
için kullanılabilir.

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.
Client:

  • Socket oluşturur.
  • Sunucunun IP ve portuna bağlanır.
  • Veri gönderir.
  • Sunucudan veri alır.
Bu yapı socket programlamanın temelidir.

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ı
kullanarak sunucuya bağlanmaya çalışır.

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
şeklinde iki veri gönderebilirsiniz.

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
bulunabilir.

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ü
gibi bilgiler olabilir.

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
bulunabilir.

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
konuları önemlidir.

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:

  • ğ
  • ş
  • ü
  • ö
  • ç
  • ı
gibi karakterler bozulabilir.

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
şeklindedir.

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
daha mantıklı olabilir.

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
işlemi yapılmaz.

Ö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.
Bu nedenle her ağ uygulamasında timeout mantığı düşünülmelidir.

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.
Uygulama bağlantı kaybını düzgün şekilde yönetmelidir.

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
için faydalıdır.

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
gibi artan bekleme süreleri kullanılabilir.

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
mesaj sistemini oluşturabilir.

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
gibi geliyorsa jitter yüksektir.

Ö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
kontrol edilmelidir.

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.

Socket1

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
Sunucu bütün verileri kontrol etmelidir.

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
sunucu tarafından doğrulanabilir.

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
kontrol edilmelidir.

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
oluşabilir.

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
kullanılmalıdır.

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
uygulamalarında oldukça yaygındır.

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
gibi birçok detayı sizin için yönetir.

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.
Client:

  • Sunucuya bağlanır.
  • Mesaj gönderir.
  • Gelen mesajları gösterir.
Bu proje socket mantığının büyük bölümünü öğretir.

İkinci Proje: Dosya Transferi​

Bir client sunucuya dosya gönderebilir.

Bu projede:

  • Dosya boyutu
  • Paketleme
  • Progress
  • Bağlantı kopması
gibi konular öğrenilebilir.

Üçü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.
Bu proje gerçek online oyunların temel mantığını anlamaya yardımcı olur.

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
gibi türler bulunabilir.

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?
bunların tamamı protokolün parçasıdır.

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
zorlaşır.

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ı
gibi bilgiler tutulabilir.

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.
Bu nedenle program:

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.
Ancak client elektrik kesintisi nedeniyle aniden kaybolabileceği için sadece düzgün disconnect paketine güvenilmemelidir.

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ı
gereksiz kullanılmaya devam edebilir.

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ü
İyi tasarlanmış bir async sunucu çok yüksek bağlantı sayılarına çıkabilir.

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
işleri kontrollü şekilde ayrılabilir.

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:

  1. IP adresi
  2. Port
  3. Client ve Server
  4. TCP
  5. UDP
  6. Connect / Listen / Accept mantığı
  7. Send / Receive
  8. Byte ve Encoding
  9. Paket sistemi
  10. Header ve paket uzunluğu
  11. Timeout
  12. Disconnect / Reconnect
  13. Heartbeat
  14. Async Socket
  15. Multi-Client Server
  16. Thread Safety
  17. Güvenlik
  18. TLS
  19. Rate Limit
  20. Sunucu optimizasyonu
Bu sıra temel ağ mantığını anlamayı kolaylaştırır.

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
konularına geçilebilir.

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
doğru tasarlanmalıdır.

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.
 

Konuyu görüntüleyenler

  • Üst