WebSocket Bağlantılarını Yönetme: Gerçek Zamanlı İletişim

WebSocket, HTTP'nin aksine sürekli açık bir bağlantı sağlar. Sunucu ve istemci arasında çift yönlü iletişim mümkün olur. Sohbet uygulamaları, canlı bildirimler ve oyunlar için ideal.

Python'da `websockets` kütüphanesi ile sunucu tarafı çok basit. Her bağlanan istemciyi takip edip broadcast yapabilirsin.

1pip install websockets

Sunucu kodu:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1import asyncio
2import websockets
3import json
4
5connected_clients = set()
6
7async def handler(websocket, path):
8connected_clients.add(websocket)
9print(f"Yeni bağlantı: {len(connected_clients)} aktif")
10
11try:
12async for message in websocket:
13data = json.loads(message)
14print(f"Alındı: {data}")
15
16# Tüm istemcilere gönder
17if connected_clients:
18await asyncio.gather(
19*[client.send(json.dumps({"user": data.get("user"), "text": data.get("text")}))
20for client in connected_clients]
21)
22except websockets.exceptions.ConnectionClosed:
23pass
24finally:
25connected_clients.remove(websocket)
26print(f"Bağlantı kapandı: {len(connected_clients)} aktif")
27
28async def main():
29async with websockets.serve(handler, "localhost", 8765):
30print("WebSocket sunucusu 8765 portunda çalışıyor...")
31await asyncio.Future()
32
33if __name__ == "__main__":
34asyncio.run(main())

JavaScript istemcisi:

1const ws = new WebSocket("ws://localhost:8765");
2
3ws.onopen = () => {
4console.log("Bağlı!");
5ws.send(JSON.stringify({user: "Ali", text: "Merhaba"}));
6};
7
8ws.onmessage = (event) => {
9const data = JSON.parse(event.data);
10console.log(`${data.user}: ${data.text}`);
11};
12
13ws.onerror = (error) => {
14console.error("Hata:", error);
15};
16
17ws.onclose = () => {
18console.log("Bağlantı kapandı");
19};

Beklenen çıktı (terminal):

1WebSocket sunucusu 8765 portunda çalışıyor...
2Yeni bağlantı: 1 aktif
3Alındı: {'user': 'Ali', 'text': 'Merhaba'}
4Bağlantı kapandı: 0 aktif

Sık yapılan hata: `connected_clients` setine sadece ekle-çıkar yapma; bağlantı kayıplarında hata alırsın. Her zaman `try-finally` ile temizle. Ayrıca `asyncio.gather()` kullanarak paralel gönderişi hızlandır, yoksa istemci sayısı arttıkça gecikme yaşarsın.

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