在zmq订户中自动重新连接

时间:2016-04-12 15:39:13

标签: python zeromq pyzmq

我有一台服务器,有时会向所有订阅者发送一些消息。有些时候我的意思是,每个月可能有一个。也许有一天它需要发送100,然后花费几个月而不发送更多。但我需要能够做到这一点。

到目前为止,我在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分钟左右发一条消息?

1 个答案:

答案 0 :(得分:2)

Heartbeats是一个很好的解决方案,但我认为您正在寻找的是ZMQ Keepalive功能。请参阅zmq_setsockopt手册页,尤其是这些选项

ZMQ_TCP_KEEPALIVE
ZMQ_TCP_KEEPALIVE_IDLE
ZMQ_TCP_KEEPALIVE_CNT
ZMQ_TCP_KEEPALIVE_INTVL

在C#中,我在我的实现中做了类似这样的事情,最终映射到上面的选项。不确定绑定是什么样的,但是有类似的属性或zmq_setsockopt调用。里程可能因您的操作系统和网络而异[/ p>

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