0

Python ソケットに基づいてクライアント サーバー プログラムを作成しています。クライアントがサーバーにコマンドを送信し、サーバーが応答します。しかし現在、一部のクライアントはメッセージを他のクライアントにブロードキャストできるため、クライアントは同時に複数の応答を受信できます。

data = s.recv(1024)

上記のコード行は、サーバーから 1 つの応答のみを取得します。しかし、このようなwhileループを使用すると

while True:
    data = s.recv(1024)
    if not data: break

実際にdata=s.recv(1024)は、データが残っていないときにプログラムをブロックします。プログラムをブロックしたくなく、接続で利用可能なすべての応答を一度に取得したいと考えています。誰でも解決策を見つけることができますか? ありがとうございました。

4

3 に答える 3

0

socket.setblockingまたはを使用できますsocket.settimeout

import socket
import sys

HOST = 'www.google.com'   
PORT = 80             
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.setblocking(0)

s.sendall('Hello, world')
try:
    data = s.recv(1024)
except:
    print 'Oh noes! %s' % sys.exc_info()[0]
s.close()

socket.recvは 2 つのパラメーターを取り、2 つ目は一連のフラグです。Linux システムを使用している場合は、man recv指定できるフラグとそれに対応するエラーのリストを確認できます。

最後に、一般に、両方がプロトコルに従っている場合でも、相手側がデータの送信を完了したことを実際に知ることはできません(両方の側を制御していない限り)。タイムアウトを使用し、リセットを送信した後に終了するのが正しい方法だと思います(これを行う方法は、使用しているプロトコルによって異なります)。

于 2013-09-25T20:53:53.080 に答える
0

ソケットをノンブロッキングにすることができます。このようにして、受信したすべての応答を取得し、何もない場合は戻ってきます。もちろん、非ブロッキングでは、定期的に再試行する必要があります。

setblocking() メソッドを使用して、ソケットをノンブロッキングにすることができます。

s.setblocking(0)

もう 1 つのオプションは、別のスレッドを使用して受信部分を処理することです。このようにして、メイン スレッドは引き続きメイン タスクを実行し、メッセージを受信した場合にのみメッセージに基づいて動作できます。

于 2013-09-25T20:52:33.780 に答える