我正在创建一个包含一台服务器和许多对等端的分布式系统。为了通讯,我使用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))