首页 > 解决方案 > Python ZMQ响应者未收到消息

问题描述

我正在尝试一个简单的zmq脚本,但不知何故响应者没有收到第一条消息。

响应程序如下所示:

def main():
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.connect("tcp://localhost:{}".format(5560))
    print("connected ...")
    while True:
          #  Wait for next request from client
          message = socket.recv_pyobj()
          #print (message)
          print(message)
if __name__ == '__main__':
    main()

我正在从另一个进程发送带有以下代码的请求:

def main():
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://localhost:{}".format(5560))
    print("sending object")
    socket.send_pyobj("ok")
    print("done")

if __name__ == '__main__':
    main()

有人知道为什么它没有到达吗?

标签: pythonsocketsnetworkingzeromqpyzmq

解决方案


您必须.bind()在代码片段中添加 IP 地址,REP而不是.connect(). 在 REP/REQ模式中有请求和响应因子,因此您可以在响应者代码中抛出反馈。因此,您的代码将如下所示:

响应者:

import zmq

def main():
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.bind("tcp://127.0.0.1:5560")
    while True:
        message = socket.recv_pyobj()
        print(message)
        socket.send_string('Your message received.')

if __name__ == '__main__':
    main()

请求代码片段:

import zmq

def main():
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    socket.connect("tcp://localhost:5560")
    print("sending object")
    socket.send_pyobj("ok")
    message = socket.recv()
    print(message)

if __name__ == '__main__':
    main()

输出(请求):

sending object
b'Your message received.'

出局(代表):

ok

[注意]:

  • 如果你想发送一个没有任何响应的简单字符串,使用 PUSH/PULL 或 SUB/PUB 模式比使用 REP/REQ 更合适,你也可以在请求部分使用而 socket.send_string('ok')不是在响应者中。socket.send_pyobj('ok')socket.recv()socket.recv_pyobj()

  • 请注意,.bind()以防万一,您不应使用localhost字符串Relevant Post


推荐阅读