Socket de sunucuya birden fazla client bağlayıp, clientlerden aynı anda yada farklı zamanlarda gelen veriyi kontrol edip hepsine farklı cevap nasıl verebilirim acaba?. Bunu araştırdım kullanış olarak threading buldum. Örneklerine de baktım denedim ama bunu socket ile kullanmayı düzgün yapamadım. aşağıda yazdığım kod üstünde yapabilir misiniz?
Server açtıktan sonra iki kere client dosyalarını açıyorum, ikiside çalışıyor sonra sıra sıra her bir clientden servara cevap gönderiyorum ama clientlerde (galiba ilk açtığım) birinde cevap gelmiyor, kalıyor öyle. Ama diger client çalışıyor.
ğ harfi sıkıntı çıkarır diye öyle yazdım. çok deneme yaptım kafam artık oralara gitti. sonuç olarak çalışdı, bu kadar kısa olucağını tahmin etmedim, baktığım örneklerin hepsi farklıydı.
Aslında internetten socket için threading örneği değil de threading için threading örneği araştıysadınız öğrendiklerinizi kendiniz de uygulayabilirdiniz. Socket için threading örneklerinin çoğu zaten threading modülünü bildiğinizi varsayar.
Vereceğiniz sayının sınırını soruyorsanız ya fiziksel hafıza ile ya da işletim sistemi sabit bir büyüklükte int kullanıyorsa onunla alakalıdır. Tabii ki sınırı var.
Traceback (most recent call last):
File "C:\Users\Dinçel\Desktop\server.py", line 6, in <module>
s.listen(918293081039889132789)
OverflowError: Python int too large to convert to C long
Verilen hataya bakarsak long veri tipinin kaç byte olduğu ile alakalı. Ama bunu kafaya takmanıza gerek yok, sizin için yeterine büyük sayıları kabul edecektir.
CPython C dilinde yazıldığı ve socket modülü C dilindekinin wrapperi olduğu için Python integer’ini C integer’ine dönüştürmeye çalışıyor. C dilinde değişkenlerin kapladıkları alanlar sabit.
Zaten bu sayı sırada kabul edilmeyen en fazla kaç tane bağlantı isteği bulunabileceğini belirliyor, sunucunun kabul edebileceği bağlantı sınırını değil.
Kusura bakmayın ama ufak bir sorum daha oldu.
client serverdan çıkınca server çöküyor aynı şekilde server kapatılınca client, ben de bunu ekledim. Bunun daha düzgün bir çözümü var mı? client kısmı içinde ekran da bir hata mesajı olabilir belki.
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost",1122))
s.listen(10)
def recv_and_send_loop(baglantı):
while True:
try:
veri = baglantı.recv(1024)
if veri.decode() == "1234":
baglantı.send(b"t")
else:
baglantı.send(b"f")
except ConnectionResetError:
pass
while True:
try:
baglantı, adres = s.accept()
threading.Thread(target = recv_and_send_loop, args = (baglantı,)).start()
except ConnectionResetError:
pass
Bir thread’daki hata diğer thread’ları etkilemediği için çökmüyor, sadece ekrana hata mesajını yazıyor. Mesajı engellemek isterseniz recv_and_send_loop içindeki try except yeterli.