如何使用socket_monitor区分同级

时间:2019-05-29 15:57:59

标签: python-3.x zeromq

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

0 个答案:

没有答案