ホームページ >バックエンド開発 >Python チュートリアル >私の Python ソケットがデータを送信せずに受信しないのはなぜですか?

私の Python ソケットがデータを送信せずに受信しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-30 18:59:12494ブラウズ

Why Doesn't My Python Socket Receive Data Without Sending?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。