2017-03-09 177 views
0

這裏是我的代碼,客戶端應該阻止在recv(它期望256個字符),導致服務器只發送5個字符,但recv返回,任何想法?Python:爲什麼recv()在阻塞模式下沒有阻塞?

#----------------------------------------------------------- 
# server.py 
import socket 
import sys 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.bind(('localhost', 10000)) 
sock.listen(1) 

while True: 
    connection, client_address = sock.accept() 
    try: 
     connection.send('hello'.encode('utf-8')) 
    except Exception: 
     connection.close() 

#----------------------------------------------------------- 
# client.py 
import socket 
import sys 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect(('localhost', 10000)) 
sock.setblocking(True) 
try: 
    data = sock.recv(256) 
    print('received "%s"' % data.decode('utf-8')) 

finally: 
    sock.close() 

回答

2

sock.recv()回報,因爲一些被接收的插座上,或者如果len(data)是0,因爲服務器關閉了連接。

預計256個字節並不意味着他們將一次性收到。在你的例子中,256最大的字節數。

阻塞行爲意味着:等到收到某些東西時,不要等到收到所有預期的東西。

如果你確信你的服務器將發送256個字節你可以做一個循環:(?WIFI)

data = '' 
while len(data) < 256: 
    data += socket.recv(256) 

如果你不能一氣呵成收到256個字節,這意味着你的網絡也許是相當不穩定或服務器或您的客戶端在嵌入式平臺上運行,且緩衝區非常小?或者服務器發送小塊...

+0

感謝mguijarr,你做出了非常明確的解釋! – Qing