ホームページ > バックエンド開発 > Python チュートリアル > クライアントを変更しない限り、最初の `recv()` 呼び出し後に Python ソケットがデータを受信しないのはなぜですか?

クライアントを変更しない限り、最初の `recv()` 呼び出し後に Python ソケットがデータを受信しないのはなぜですか?

Susan Sarandon
リリース: 2024-11-28 20:10:16
オリジナル
640 人が閲覧しました

Why Doesn't My Python Socket Receive Data After the First `recv()` Call Unless I Modify the Client?

Python ソケットが送信せずにデータを受信しない

問題:

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート