无法使用ZeroMQ

时间:2018-02-23 16:31:31

标签: python zeromq distributed-system

我正在执行这个服务器程序,从多个客户端接收,但是在一个客户端的第一条消息之后,服务器正在接收数据,然后它不等待其他客户端请求,只显示第一个客户端数据并停止

此外,我无法成为使用相同Linux机器的其他VM的客户端。我不知道如何修改它以便让服务器从更多客户端接收。

1.我在不同的VM-s中运行相同的客户端程序并尝试将数据发送到服务器。只传递一条客户端消息,而其他客户端无法发送并等待。

由于

import zmq
import json

ports = ["192.168.1.24:10000"]

context = zmq.Context()
print("Connecting to server")
socket = context.socket(zmq.DEALER)
socket.setsockopt(zmq.LINGER, 0)
for port in ports:
    socket.connect("tcp://%s" % port)
    print("Successfully connected to server %s" % port)

for request in range(len(ports)):
    print("Sending request ", request, "...")
    socket.send_string("", zmq.SNDMORE) 
    socket.send_string("Sensor Data") 

    # use poll for timeouts:
    poller = zmq.Poller()
    poller.register(socket, zmq.POLLIN)

    socks = dict(poller.poll(5 * 1000))

    if socket in socks:
        try:
            socket.recv()  # discard delimiter
            msg_json = socket.recv()  # actual message
            sens = json.loads(msg_json)
            response = "am: %s :: pam: %s :: dam: %s" % (sens['a'], sens['b'], sens['c'])
            print("Received reply ", request, "[", response, "]")
        except IOError:
            print("Could not connect to machine")
    else:
        print("Machine did not respond")

客户端:

import zmq
import time
import json

port = "10000"

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:%s" % port)

while True:
    #  Wait for next request from server
    message = str(socket.recv(), "utf-8")
    print("Received request: ", message)
    time.sleep(1)
    msgDict = {
        'am': "990",
        'pam': "11",
        'dam': "1",
    }
    ms = json.dumps(msgDict)
    socket.send_string(ms)

1 个答案:

答案 0 :(得分:0)

在您的活动流程中似乎没有很好的细节:

根据您的代码,客户端会生成一个 .send_string( json.dumps( msgDict ) )

但是在服务器端,您的代码会连续两个 .recv() -s,这两个都是阻塞的。

所以会发生的事情是,在读完第一个.recv()读取的消息后,服务器会直接进入第二个,再次阻塞.recv(),在那里它会等待无限长时间(按照指示)在所有情况下,没有其他消息从外部世界传递到您本地Context()实例的手中。在任何这种情况下,.recv()的阻塞形式根本不会返回。

如果怀疑是否有任何内容需要阅读, POLLIN 事件是条件必要条件,并使用其他测试,直到调用 { {1}} 返回 socket.getsockopt( zmq.RCVMORE ) ,在所有首次收到的消息后,多部分元素(如果存在)已经耗尽。

鉴于您的客户端代码选择使用 False -archetype,它将永远不会发送任何消息,而不会首先要求服务器执行此操作。如果您的服务器代码挂在上面解释的(概念上不明确的)阻止REQ内,它将永远不会问另一个"另一个" .recv() - 客户回复。