2016-04-12 3 views
2

У меня есть сервер, который иногда отправляет сообщения всем подписчикам. С чем-то я имею в виду, может быть, один раз в месяц. Возможно, однажды ему нужно отправить 100, и после этого он проводит несколько месяцев, не отправляя больше. Но мне нужно, чтобы это можно было сделать.Автоматическое повторное подключение к абоненту zmq

До сих пор у меня есть издатель на 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

Heartbeats - прекрасное решение, но я думаю, что вы ищете функцию ZMQ Keepalive. Смотрите страницу zmq_setsockopt человека, в частности, эти варианты

ZMQ_TCP_KEEPALIVE 
ZMQ_TCP_KEEPALIVE_IDLE 
ZMQ_TCP_KEEPALIVE_CNT 
ZMQ_TCP_KEEPALIVE_INTVL 

В C#, я делаю что-то вроде этого, как по умолчанию в моей реализации, что в конечном итоге отображает до выше опций. Не уверен, как выглядит ваше привязку, но есть либо похожие свойства, либо вызов zmq_setsockopt. Пробег может различаться в зависимости от вашей ОС и сети.

_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

 Смежные вопросы

  • Нет связанных вопросов^_^