2017-03-09 9 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バイトは、1度に受信されるとは限りません。あなたの例では、256最大バイト数です。

ブロックする動作とは、何かが受信されるまで待機し、すべての受信が予想されるまで待機しないことを意味します。あなたが256のバイトを送信するサーバーは、あなたがループを作ることができる確信している場合

は:(?無線LAN)

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

あなたは一度に256のバイトを受信できない場合、それはあなたのネットワークが多分かなり不安定であることを意味しますかサーバまたはクライアントは、非常に小さなバッファを備えた組み込みプラットフォーム上で動作しますか?またはサーバーが小さなチャンクを送信しています...

+0

ありがとうございましたmguijarr、あなたは非常に明確な説明をする! – Qing

関連する問題