Нулевой MQ — как определить, какой клиент отключен

#python #python-3.x #zeromq #pyzmq

Вопрос:

В настоящее время я запускаю модель клиент-сервера с использованием сокетов дилера и маршрутизатора. Мне нужно определить, от какого клиента поступают сообщения, а также определить, когда клиент был отключен. Когда клиент отключается от сервера, мне нужно выполнить некоторую обработку на стороне сервера.

Я нашел функцию recv_monitor_message, которая помогает мне на полпути туда. Я могу использовать его для обнаружения новых подключений и отключений, и он возвращает файловый дескриптор, который, возможно, можно использовать для идентификаторов соединений. Проблема в том, что при вызове recv_multipart, как мне сопоставить идентификатор дескриптора файла (из recv_monitor_message ) с полученным сообщением ? Может быть, есть другой способ сделать это ?

Код сервера

 import threading import zmq from zmq.utils.monitor import recv_monitor_message   active_clients = set()   def event_monitor(monitor):  while monitor.poll():  evt = recv_monitor_message(monitor)  print("Event: {}".format(evt))  if evt['event'] == zmq.EVENT_MONITOR_STOPPED:  break  elif evt['event'] == zmq.EVENT_ACCEPTED:  print(f"new connection accepted id={evt['value']}")  active_clients.add(evt['value'])  elif evt['event'] == zmq.EVENT_DISCONNECTED:  print(f"connection disconnected id={evt['value']}")  active_clients.remove(evt['value'])   monitor.close()  print("event monitor thread done!")    c = zmq.Context() s = c.socket(zmq.ROUTER) s.setsockopt(zmq.HEARTBEAT_IVL, 1000) s.setsockopt(zmq.HEARTBEAT_TIMEOUT, 5000) s.setsockopt(zmq.HEARTBEAT_TTL, 5000) s.bind('tcp://127.0.0.1:5555')  monitor = s.get_monitor_socket()  t = threading.Thread(target=event_monitor, args=(monitor,)) t.start()  while True:  id, data = s.recv_multipart()   """"  I would like to know which of active_clients this data came from  """  s.send_multipart([id, data], zmq.NOBLOCK)  

Код клиента

 import zmq import time c = zmq.Context() s = c.socket(zmq.DEALER) s.setsockopt(zmq.HEARTBEAT_IVL, 1000) s.setsockopt(zmq.HEARTBEAT_TIMEOUT, 5000) s.setsockopt(zmq.HEARTBEAT_TTL, 5000)  s.connect('tcp://127.0.0.1:5555') i = 0 while True:  s.send(str(i).encode())  print(s.recv())  i  = 1  time.sleep(1)