2016-12-03 117 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") 

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