Socket Programlamaya Giriş
Socket programlama, bilgisayar ağlarında uygulamalar arasında iletişim sağlamak için kullanılan bir tekniktir. Python dilinde socket modülü, bu süreçleri kolaylaştırmak için güçlü bir araç sunar. Socketler, bilgisayarlar arasında veri alışverişine izin verir ve genellikle sunucu istemci mimarisinde kullanılır. Bu makalede, Python ile socket accept işlevini derinlemesine inceleyeceğiz ve bir sunucu oluşturarak istemci bağlantılarını nasıl kabul edeceğimizi öğreniyoruz.
Socket’lerin çalışma mantığını anlamak için öncelikle bir sunucu ve istemci arasında nasıl bir bağlantı kurulduğuna dair genel bir bakışa ihtiyaç duyacağız. Sunucu, belirli bir IP adresinde dinleme yapar ve bir istemciden gelen bağlantı taleplerini karşılar. İstemci, sunucuya bağlanmak için belirli bir IP adresi ve port numarası kullanır. Socket accept fonksiyonu, sunucunun belirli bir portta dinlerken gelen bağlantı isteklerini kabul etmesini sağlayan temel bir bileşendir.
Socket modülünü Python proje ortamına dahil etmek için basit bir import socket
ifadesi yeterlidir. Ardından, bir socket nesnesi oluşturarak iletişim kurmak istediğimiz protokole uygun bir yapılandırma yapılmalıdır. Genelde TCP/IP protokollerini kullanarak veri iletimi sağlanır. Bu kılavuzda, TCP üzerinden bağlantı kurmayı ele alacağız.
Sunucu Oluşturma
Artık socket programlamanın temel kavramlarını öğrendiğimize göre, bir TCP sunucusu oluşturarak gelen bağlantıları nasıl kabul edeceğimizi inceleyelim. İlk olarak, socket modülünü projemize dahil ederek başlayalım. Ardından, bir socket nesnesi oluşturup sunucunun dinleyeceği IP adresini ve port numarasını ayarlayacağız.
İlk olarak bir socket nesnesi oluşturalım:
import socket
# Socket nesnesi oluştur
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Burada AF_INET
ile IPv4 protokolü kullanılıyor. SOCK_STREAM
, TCP bağlantısını belirtir. Şimdi sunucunun bağlanacağı adres ve portu belirlemeliyiz. Genellikle localhost kullanarak testi kolaylaştırabiliriz:
host = '127.0.0.1'
port = 65432
# Socketi belirtilen adrese bağla
server_socket.bind((host, port))
Bağlantı yapıldıktan sonra, sunucunun giriş bağlantı taleplerini kabul etmesi için dinlemeye geçmesini sağlamalıyız. listen()
fonksiyonu ile dinleme moduna geçiyoruz:
server_socket.listen(5) # Maksimum 5 bekleyen bağlantı
Burada 5, aynı anda bekleyen maksimum bağlantı sayısını belirtir. Daha sonra, sunucunun çalıştığını göstermek için bir çıktı alabiliriz:
print(f'Sunucu {host}:{port} adresinde dinliyor...')
Bağlantıları Kabul Etme
Sunucunuz hazırlanmışken, şimdi bağlantıları kabul etmeye hazır haldedir. accept()
yöntemini kullanarak gelen bağlantıyı kabul edeceğiz. Bu işlem genellikle bir döngü içinde gerçekleştirilir, böylece sunucu durmaksızın yeni istemcilerle bağlantı kurabilir. İşte bağlantı kabul etmenin kilit noktaları:
while True:
conn, addr = server_socket.accept() # Bağlantıyı kabul et
print(f'Bağlantı kabul edildi: {addr}') # Bağlanan istemcinin adresini yazdır
Bu döngü çalıştığı sürece sunucu yeni bağlantıları sürekli olarak kabul eder. accept()
metodu, bağlantı kurulan socket nesnesi ve istemcinin adres bilgilerini döndürür. Burada conn
nesnesi, bağlantı kurulan istemciye spesifik bir socket nesnesidir.
Her bir istemci bağlantısının ardından, onları bilgilendirmek amacıyla kısa bir mesaj gönderebiliriz. Örneğin:
conn.sendall(b'Hoşgeldiniz! Sunucu ile bağlantınız kuruldu.') # İstemciye mesaj at
Veri Alımı ve İletimi
Bağlantı kurduğumuzdan bu yana, istemciden veri almayı ve onlara yanıt verebilmeyi öğrenmek önemlidir. recv()
metodunu kullanarak istemciden gelen verileri alabiliriz. Aynı zamanda verileri gönderme işlemini de gerçekleştirebiliriz:
data = conn.recv(1024) # 1024 bayt veriyi al
print(f'Alınan veri: {data.decode()}') # Veriyi çöz ve yazdır
Bu noktada, istemciden gelen veriyi okuyarak bir doğrulama veya yanıt işlemi yapabiliriz. Eğer istemci belirli bir mesaja cevap vermek istiyorsa, bu durumu kontrol ederek uygun bir yanıt oluşturabiliriz. Aşağıdaki örnek, istemciden gelen veriye bağlı olarak sunucunun nasıl yanıt vereceğini gösteriyor:
if data:
reply = b'Respon alındı!'
conn.sendall(reply)
Bağlantıyı Kapatma
Her zaman için bağlantıyı kapatma sürecine dikkat etmeliyiz. Gereksiz açık bağlantılar, sistem kaynaklarını tüketebilir ve güvenlik riskleri oluşturabilir. İstemci bağlantısını kapatmak için close()
metodunu kullanmalıyız:
conn.close() # Bağlantıyı kapat
Ayrıca, döngüden çıkılma koşulunu belirleyerek sunucunun çalışmasını durdurmak da önemli bir adımdır. Örneğin, istemciden ‘exit’ mesajı alırsak sunucuyu durdurmak isteyebiliriz:
if data.decode() == 'exit':
print('İstemci bağlantısı sonlandırıldı.')
break
Son Olarak
Socket programlamaya bir giriş yaptık ve temel bağlantı kabul işlemlerini öğrendik. Python ile socket accept yanlızca basit veri iletiminin ötesine geçerek, ağ üzerinden daha karmaşık iletişim sistemleri geliştirmemize olanak tanır. Bu yazıda ele aldığımız konular, kendi projelerinizde kullanabileceğiniz temel bilgiler sunmaktadır.
Bir sunucu uygulaması geliştirirken güvenlik önlemlerine dikkat etmek önemlidir. Ayrıca, bağlantı yönetimi ve veri iletimi sırasında olası hatalara karşı hazırlıklı olmalısınız. Hataları önceden tahmin edebilmek için doğru hata yakalama mekanizmalarını kullanmak, yazılım kalitesini artıracaktır.
Artık, soket programlamayı biraz daha öğrenmek için uygulamalar geliştirmeye ve deney yapmaya hazırsınız. Hem sunucu hem de istemci tarafında geliştirmeler yaparak deneyiminizi artırın. Unutmayın, her yeni proje sizi bir adım ileri taşıyacaktır!