Python Socket Programlama: Sunucu ve İstemci Temelden Kurmak

Socket programlama, iki bilgisayar arasında veri iletişiminin temelini oluşturur. Python'da bunu yapmak basit; `socket` modülü ile başlayabilirsin. Önce basit bir sunucu-istemci ikilisini kuralım, sonra birden fazla bağlantıyı aynı anda nasıl yönetileceğini göreceğiz.

Basit bir sunucu yazmaktan başla. Sunucu, belirli bir port'ta dinler ve gelen istemcileri kabul eder. temel yapı:

1import socket
2
3# Sunucu soketi oluştur
4server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5server.bind(('localhost', 5000))
6server.listen(1)
7print("Sunucu 5000 portunda dinliyor...")
8
9# Bağlantı kabul et
10connection, address = server.accept()
11print(f"Bağlantı geldi: {address}")
12
13# Veri al ve gönder
14data = connection.recv(1024)
15print(f"Alınan: {data.decode()}")
16connection.send(b"Merhaba istemci!")
17connection.close()
18server.close()

İstemci tarafı da benzer; sunucuya bağlanıp veri gönderir:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import socket
2
3client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
4client.connect(('localhost', 5000))
5client.send(b"Merhaba sunucu!")
6response = client.recv(1024)
7print(f"Yanıt: {response.decode()}")
8client.close()

Ancak bu yapı tek bir istemciyi işler; diğer bağlantılar beklemek zorunda kalır. Çoklu bağlantıları engelleme olmadan yönetmek için `select` modülünü kullan. Böylece sunucu, birden fazla istemciyi aynı anda dinleyebilir:

1import socket
2import select
3
4server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5server.bind(('localhost', 5000))
6server.listen(5)
7server.setblocking(False)
8
9connections = [server]
10print("Sunucu çalışıyor...")
11
12while True:
13readable, _, _ = select.select(connections, [], [])
14for sock in readable:
15if sock is server:
16try:
17conn, addr = sock.accept()
18conn.setblocking(False)
19connections.append(conn)
20print(f"Yeni bağlantı: {addr}")
21except:
22pass
23else:
24try:
25data = sock.recv(1024)
26if data:
27print(f"Alınan: {data.decode()}")
28sock.send(b"Mesaj alındı")
29else:
30connections.remove(sock)
31sock.close()
32except:
33pass

`select` modülü, hangi soketlerin veri için hazır olduğunu kontrol eder ve sadece onları işler. Bu sayede sunucu, on, yüz hatta binlerce istemciyi etkili bir şekilde yönetebilir. Üretim ortamında daha ölçeklenebilir çözümler için `asyncio` ya da `threading` kullanabilirsin, ama bu temel yapı socket programlamanın kalbidir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz