2016-12-03 119 views
0

我想用ZeroMQ连接环形拓扑中的几台主机。但是我经过很长时间的努力,现在希望能得到一些帮助。用于环形拓扑的ZeroMQ - 如何配置套接字?

基本上我有一个客户端C,它通过多个主机H1 ... Hn发送消息M给自己S.这是一个环形通讯。

C -> H2 -> H1 -> S # where C and S are on the same host. 

IP addresses: 
C, S: 192.168.100.165 
H2: 192.168.100.102 
H1: 192.168.100.101 

H1和H2需要将消息做一些处理并转发给下一个主机。

我试图遵循official ZeroMQ docextended request-reply pattern示例。

这是我的客户C:

main_context = zmq.Context() 
client_socket = main_context.socket(zmq.REQ) 
client_socket.connect("tcp://192.168.100.102:5556") 
while 1: 
    client_socket.send("hello!") 
    ug_response = client_socket.recv() 
    time.sleep(3) 

这里说到我的服务器S(即在同一台主机上,即使相同的程序,只是另一个线程。):

ug_server_context = zmq.Context() 
server_socket = ug_server_context.socket(zmq.REP) 
server_socket.bind("tcp://*:5558") 
while 1: 
    updated_ug_message = server_socket.recv() 
    server_socket.send("ug received.") 

这是我的“经纪人” H1和H2使用路由器和经销商:

context = zmq.Context() 
# Prepare broker sockets 
frontend = context.socket(zmq.ROUTER) 
backend = context.socket(zmq.DEALER) 
frontend.bind("tcp://*:5556") # for H1: 5557 
backend.bind("tcp://*:5557")  # for H1: 5558 

# Initialize broker poll set 
poller = zmq.Poller() 
poller.register(frontend, zmq.POLLIN) 
poller.register(backend, zmq.POLLIN) 

# Switch messages between sockets 
while 1: 
    socks = dict(poller.poll()) 

    if socks.get(frontend) == zmq.POLLIN: 
     message = frontend.recv_multipart() 
     backend.send_multipart(message) 

    if socks.get(backend) == zmq.POLLIN: 
     message = backend.recv_multipart() 
     frontend.send_multipart(message) 

的事情是,它不工作,我的问题是:

1. H2如何知道它必须发送消息给H1?

2.我正朝着正确的方向走吗?

回答

0

好的,在此期间我自己想出了它。我不得不改变:

backend.bind("tcp://*:5557") 

到:

backend.connect("tcp://192.168.100.101:5557") 

现在我的通信圈工作得很好。