問題:
Python のsocket.recv() メソッドが返されないデータをエコー サーバー コードに編集した後、2 回目に呼び出されたときのデータ。 client.
分析:
TCP ソケットはデータのストリームとして動作し、送信呼び出しと受信呼び出しの間に 1 対 1 の相関関係がありません。初期のコードは、クライアントが接続を閉じるまでサーバーが受信したものを正確に送り返す特定のプロトコルに準拠していました。
修正によりルールが変更され、サーバーはクライアントが接続を閉じるまで応答せずにデータを継続的に受信および破棄するようになりました。彼らの終わりを閉じた。クライアントは、即時応答を期待しているため、無期限にハングします。
解決策:
この問題を解決するには、クライアントは、変更されたサーバー プロトコルに一致するように動作を調整する必要があります。
クライアント変更:
ソケットの送信側を閉じて完了を通知し、サーバーが応答を送信できるようにします。潜在的なデータ断片化を処理するために複数のrecv()操作を実装します。
import socket HOST = 'localhost' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') s.shutdown(socket.SHUT_WR) data = b'' while True: buf = s.recv(1024) if not buf: break data += buf s.close() print('Received', repr(data))
サーバーを更新しましたコード:
クライアントが受信接続を閉じたら「ok」を送信して、変更されたプロトコルを維持します。
import socket HOST = '' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(b'ok') conn.shutdown(socket.SHUT_WR) conn.close()
以上がクライアントを変更しない限り、最初の `recv()` 呼び出し後に Python ソケットがデータを受信しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。