#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)