Я создаю распределенную систему с одним сервером и множеством пиров.Для связи я использую ZeroMQ, шаблон REQ-REP.Для того, чтобы иметь возможность обнаружить, что соединение было потеряно, я использую socket_monitor.Проблема в том, что, когда я получаю сообщение об отключении, я не знаю, как определить, какой узел был отключен.Единственная информация, которая позволяет различать соединения, - это файловый дескриптор, который я получаю от socket_monitor, но я не знаю, к какому соединению / пиру он принадлежит.
Код клиента:
class ZMQ_RPC():
def __init__(self):
context = zmq.Context()
self.socket = context.socket(zmq.REQ)
self.socket.connect("tcp://128.141.79.50:8003")
def send_RPC(self, function_name, *args):
msg = [function_name, *args]
msg = pickle.dumps(msg)
self.socket.send(msg)
message = self.socket.recv()
print(message)
Код сервера:
EVENT_MAP = {}
print("Event names:")
for name in dir(zmq):
if name.startswith('EVENT_'):
value = getattr(zmq, name)
print("%21s : %4i" % (name, value))
EVENT_MAP[value] = name
context = zmq.Context()
socket = context.socket(zmq.REP)
monitor = socket.get_monitor_socket()
socket.bind("tcp://128.141.79.50:8003")
poller = zmq.Poller()
poller.register(monitor, zmq.POLLIN | zmq.POLLERR)
poller.register(socket, zmq.POLLIN | zmq.POLLERR)
while True:
socks = dict(poller.poll())
if socket in socks:
message = socket.recv()
message = pickle.loads(message)
try:
func = getattr(self, message[0])
func(*message[1:])
socket.send(b"Success")
except AttributeError:
socket.send(b"Error")
if monitor in socks:
evt = recv_monitor_message(monitor)
evt.update({'description': EVENT_MAP[evt['event']]})
print("Event: {}".format(evt))