ホームページ >バックエンド開発 >Python チュートリアル >私の Python ソケットがデータを送信せずに受信しないのはなぜですか?
Python ソケットが送信せずに受信できない
この質問は、Python のドキュメントから変更されたソケットの例が、初回送信は無効になっています。この問題は、データを連続ストリームとして扱う TCP ソケットの固有の性質によって発生します。
元の例では、while ループにより、サーバーが受信したすべてのメッセージをエコー バックすることが保証されていました。これにより、送信が応答をトリガーする単純なプロトコルが確立されました。
ただし、修正されたバージョンでは、エコー機能を削除するとプロトコルが中断されます。サーバーはデータの無限のコンシューマとなり、クライアントが接続を閉じるのを待ちます。送信が無効になっているため、クライアントのデータは確認もエコーバックも行われず、応答を待っている間にハングアップします。
解決策は、クライアントの動作を新しいプロトコルに適応させることです。クライアントは、即時の応答を期待するのではなく、接続の終了を適切に閉じる必要があります。これにより、データの送信が完了したことがサーバーに通知され、予期された「ok」メッセージを送信するようサーバーに指示されます。
信頼性を高めるために、クライアントは複数の recv 呼び出しを使用して、起こり得るデータの断片化に対処できます。この変更により、セグメント化されたメッセージも正常に受信されるようになります。
更新されたコード例:
サーバー
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()
クライアント
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))
これらの変更に従うことで、この例では次のことが保証されます。サーバーからの即時の応答がなくても、クライアントはハングせず、サーバーはデータ交換を適切に処理します。
以上が私の Python ソケットがデータを送信せずに受信しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。