1

この単純なサーバースクリプトがあります。このスクリプトの目的は次のとおりです。

  1. クライアント接続を待つ
  2. クライアントが切断されるまで、クライアントからメッセージを受信します
  3. クライアントが切断したら、別のクライアントが接続するのを待ちます
  4. クライアントが切断されるまでメッセージを受け取る
  5. 繰り返す...

import socket

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",5000))
server_socket.listen(5)
print "Awaiting Client connection"
client_socket, address =server_socket.accept()
print "Connection established.. with ",address
while True:
    data=client_socket.recv(512)
    if not data:
        client_socket.close()
        print "Client disconnected, Awaiting new connections..."
        client_socket, address =server_socket.accept()
        print "Connection from ",address
    else:
        print "RECIEVED:",data

私の質問は、スクリプトが 2 台の PC でテストしたときに動作しているように見えても、クライアントからの接続を受信した後に気づいたことです。 line no 7

print "Connection established.. with ",address

クライアントがメッセージを送信するまで、Python シェル ウィンドウが応答しないようです (シェル ウィンドウを移動しようとすると応答しなくなります)。

私が理解している限り、クライアントからの着信メッセージがない場合はclient_socket.recv(512)、クライアントからのデータを待つだけです。

しかし、なぜそれは無反応になったのですか?わかりやすくするために、

-スクリプトは問題なく動作します(データを受信して​​画面から出力し、クライアントが切断された場合は新しい接続を待ちます)

-コンソール ウィンドウのカーソルの点滅が止まる

- コンソール ウィンドウを移動しようとすると、応答しなくなり、「このプログラムは応答を停止しました」というメッセージが表示されます。

4

1 に答える 1

1

基本的に、acceptこの行の後にある呼び出しでブロックをスクリプト化します。

print "Client disconnected, Awaiting new connections..."

このaccept呼び出しは、特定のクライアントがサーバーへの接続を試みた場合にのみ返されます。それは、スクリプトが次の行まで実行を継続するときです。これが、 Windows でこのプログラムが応答していませんのようなメッセージが表示される理由です。

スクリプトの応答性を確保するために、ノンブロッキング ソケット I/O アプローチの使用を検討できます。

ブロッキング呼び出しと非ブロッキング呼び出しの説明については、このリンクを参照してください。また、この質問を参照して、Python でノンブロッキング ソケットを実装する方法を理解することもできます。もちろん、Web リソースもたくさんあります。

お役に立てれば

于 2013-08-30T04:29:01.913 に答える