2016-06-15 9 views
0

ソケットは単にインターフェースにバインドし、このように、すぐにメッセージを受信することができますされていますPythonでZMQ:ZMQの各着信接続のための新しいソケットオブジェクト

socket.bind("tcp://*:5555") 
message = socket.recv() 

複数の接続がにデータを送信することができるので、そのソケットを同時に、どのように別の送信者を区別する?一方

正規ソケットと、着信接続が最初にこのような新しいソケット、スポーンれ、受け入れられ、:ここ

serversocket.bind((socket.gethostname(), 5555)) 
serversocket.listen() 
(clientsocket, address) = serversocket.accept() 

を各々がを通じて受信されているので、異なる送信者を容易に区別することができます別のソケット。

ZMQの便利なメッセージベースのキューバッファリング通信の恩恵を受ける最善の方法はありますが、リクエストされると同時に任意の数の識別可能な1対1接続を作成しますか?

答えて

0

異なるクライアントを区別する方法は、あなたの「サーバー」としてどのソケットタイプを使用しているかによって異なります。以下の説明は、うまくいけば2番目の質問にも答えます。

REQ - 要求を送信したクライアントに返信し、REQソケットのrecvコールが最初に処理されるまで、あなたは次の要求を処理することはできませんsendが続かなければなりません。ただし、異なるクライアントからの複数の要求がキューに入れられます。

ROUTER - 送信者のクライアントIDを含むメッセージrecvにフレームを追加します。メッセージを送信するとき、最初のフレームは削除され、どの接続クライアントが返信するかを識別するために使用されます。すべてのフレームを空の区切り枠まで格納し、返信を送信するときには、返信メッセージの先頭に追加する必要があります。 REQとは異なり、recvへの別のコールの前にメッセージが送信される必要はありません。send指定されていない場合、クライアントIDはZeroMQによって生成されますが、 '永続性'が必要な場合はsetsockoptzmq.IDENTITYフラグを使用してIDを設定できます。

+0

ありがとうございました。 追加質問: 'ROUTER'がクライアントIDを選択するスキーマを設定できますか? このようなサーバー生成のクライアントIDはどのくらい永続的ですか?どのような状況で変化しますか?これを制御/検出することは可能ですか? –

+0

私が知っている唯一の設定は 'setsockopt'です。自動的に生成されたIDは、接続の存続期間中は同じままです。私はこれがサイレント再接続をカバーするかどうかはわかりませんが、基本的なネットワーク接続がダウンした場合、zeromqは再接続を行います。私は通常、 'setsockopt'経由でIDを設定します。接続、送信、切断、後で再接続、前回のリクエストからのステータス更新の取得が可能です。 – David

関連する問題