2016-04-12 17 views
2

私は時々すべての加入者にいくつかのメッセージを送るサーバを持っています。一言で言えば、たぶん1ヶ月に1つです。たぶん1日に100を送る必要があり、それ以降はもっと送ることなく数ヶ月を費やすでしょう。しかし、私はそれができるようにする必要があります。zmqサブスクライバで自動再接続

これまでは、Pythonでパブリッシャを持っていて、フレームとサブスクライバをPythonでも各エンドデバイスに送りました。最後のデバイスのスクリプトはしばらくしてから切断されているようです。私のテストでは、私はしばらくの間メッセージを送信できますが、私が約10分間送信すると、次のメッセージは受信されません。

加入者がハートビートなどを随時送信する方法はありますか?または、切断を検出してできるだけ早く再接続しますか?私はメッセージコントロールを持っているのでパッケージを見逃しても構いません。サーバーが応答を受け取っていない場合は、次の分以内にメッセージコントロールを受信します。

私は、サーバーに接続するには、このコードを持っている:

portSubOuter = "6100" 
context = zmq.Context() 
socketOuter = context.socket(zmq.SUB) 
socketOuter.connect("tcp://my_domain_url:%s"% portSubOuter) 
socketOuter.setsockopt(zmq.SUBSCRIBE, '') 

をそして、これは読むために私のコードです:

macRecv = socketOuter.recv() 
print "Packet for mac: %s"%macRecv 
if macRecv == repr(myMACOuter): 
    more = True 
    while more: 
     part_received = socketOuter.recv() 
     part.append(part_received) 
     more = socketOuter.getsockopt(zmq.RCVMORE) 
    .... 

私は出版社側のハートビートを実装する必要がありますか? 2分ごとにメッセージを送信するようにしますか?

答えて

2

ハートビートは素晴らしい解決策ですが、私はあなたが探しているのはZMQキープアライブ機能だと思います。 C#ではzmq_setsockopt manページ、特にこれらのオプション

ZMQ_TCP_KEEPALIVE 
ZMQ_TCP_KEEPALIVE_IDLE 
ZMQ_TCP_KEEPALIVE_CNT 
ZMQ_TCP_KEEPALIVE_INTVL 

を参照してください、私は最終的に上記のオプションまでマッピングされ、私の実装では、デフォルトとして、このような何かをやっています。バインディングがどのようなものかはっきりしていませんが、同様のプロパティーまたはzmq_setsockopt呼び出しがあります。走行距離はお使いのOSやネットワークによって異なる場合があります

_socket.Options.TcpKeepalive = Enable 
_socket.Options.TcpKeepaliveIdle = (int)new TimeSpan(0, 5, 0).TotalSeconds; 
_socket.Options.TcpKeepaliveInterval = (int)new TimeSpan(0, 0, 30).TotalSeconds; 
+0

これを確認するには、日曜日まで待つ必要があります。しかし、私はPythonで実装しようとします。ほぼ同じようなものがあることをほとんど確信してください。ありがとうございました。最終的なコードを実装するとすぐに投稿を更新します。 – Biribu

+0

@Biribuそれはあなたのために働くのですか? – jab

関連する問題