我有一台服务器,有时会向所有订阅者发送一些消息。有些时候我的意思是,每个月可能有一个。也许有一天它需要发送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分钟左右发一条消息?
答案 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;