Soketinizin engelleyici olmayan bir modda olup olmadığı gerçekten önemli değil; recv/gönderme işlemi hemen hemen aynı; Tek fark, engelleme olmayan soketin veri/soket beklemek yerine 'Geçici olarak geçici olarak kullanılamaz' hatası vermesidir.
recv yöntemi, alınan bayttan daha az veya eşit olduğu söylenen alınan bayt sayısını döndürür.
def recvall(sock, size):
data = ''
while len(data) < size:
d = sock.recv(size - len(data))
if not d:
# Connection closed by remote host, do what best for you
return None
data += d
return data
Bu mod engelleme tam olarak aynı yapmak zorunda, hatırlamak önemlidir: Tam olarak boyut bayt almak istiyorsanız, aşağıdaki koda benzer bir şey yapmalıdır. (Uygulama katmanına iletilmektedir bayt sayısı OS recv tampon boyutu ile sınırlıdır, örneğin içindir.)
gönderme yöntem geçen şeridin uzunluğuna az ya da eşit olduğu söylenir gönderilen bayt sayısını, . Bir istisna hata (belgelere göre)
def sendall(sock, data):
while data:
sent = sock.send(data)
data = data[sent:]
Sen sock.sendall doğrudan kullanabilirsiniz, ancak yapabilirsiniz: gönderildiği mesajın tamamını sağlamak istiyorsanız, aşağıdaki koda benzer bir şey yapması gerektiğini kaldırdı ve varsa, ne kadar veri başarıyla gönderildiğini belirlemenin bir yolu yoktur.
Python'daki yuvalar BSD soketi API'sini takip eder ve c tarzı soketlere benzer şekilde davranır (fark, örneğin, hata kodunu döndürmek yerine istisna atar). Web ve man sayfaları üzerinde herhangi bir soket öğretici ile mutlu olmalısınız.
http://www.doughellmann.com/PyMOTW/select/ – Epeli
Muhtemelen send() ve sendall() arasında ayrım yapmak istersiniz. http://tarekziade.wordpress.com/2011/07/12/firefox-sync-python/ Ayrıca büyük olasılıkla bazı üst düzey senkronize olmayan IO altyapısını kullanmak isteyebilirsiniz: Eventlet: http://eventlet.net/ –