ZeroMQ路由器套接字无法向代表发送消息

2024-09-30 12:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用ZeroMQ实现了一个简单的请求-应答体系结构。这对于pyzmq2.1.11版是正确的。不幸的是,当我在PyZMQ 14.0.0版上测试它时,sender(REQ)可以发送到路由器,然后路由器接收到它的消息并发送到接收方(REP),但是接收方没有接收到消息! 当我将PyZMQ从2.1.11版升级到14.0.0版时遇到了这个问题。在

请求<;->;路由器<;->;代表

这是我的代码:

发件人.py

import zmq
import time

if __name__=='__main__':
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    socket.setsockopt(zmq.IDENTITY, "S")
    socket.connect("tcp://127.0.0.1:6660")
    i = 0
    while True:
        i += 1
        socket.send("R", zmq.SNDMORE)
        socket.send("", zmq.SNDMORE)
        socket.send("Message: %d" % i)
        print("Message : %d sent" % i)
        fromAddr = socket.recv()
        empty = socket.recv()
        resp = socket.recv()
        print("%s received!" % str(resp))
        time.sleep(1)

路由器.py

^{pr2}$

接收器.py

import zmq
import time

if __name__=='__main__':
    context = zmq.Context()
    socket = context.socket(zmq.REP)
    socket.setsockopt(zmq.IDENTITY, "R")
    socket.connect("tcp://127.0.0.1:6660")
    while True:
        print("Wating for request...")
        toAddr = socket.recv()
        empty = socket.recv()
        req = socket.recv()
        print("%s received!" % str(req))
        socket.send(toAddr, zmq.SNDMORE)
        socket.send(empty, zmq.SNDMORE)
        socket.send("Reply to %s" % str(req))

当我使用这种架构时:

routing with DEALER

DEALER不路由到多个接收器。DEALER只使用循环方法向接收者发送消息。如果可以使用ROUTER代替DEALER,则可以将消息路由到特定的接收方,并在这些接收者之间进行循环。在


Tags: pyimportsend消息timecontext路由器socket
2条回答

根据@nos的说法,ROUTER-to-REP是无效组合,而ROUTER-to-ROUTER socket是有效的组合。很简单,我把REP套接字改成了路由器!修订后的代码如下:

import zmq

if __name__=='__main__':
    context = zmq.Context()
    socket = context.socket(zmq.ROUTER)       # Changed
    socket.setsockopt(zmq.IDENTITY, "R1")
    socket.connect("tcp://127.0.0.1:6660")
    while True:
        print("Wating for request...")

        me = socket.recv()       # New
        empty = socket.recv()    # New
        toAddr = socket.recv()
        empty = socket.recv()
        req = socket.recv()
        print("%s received!" % str(req))

        socket.send(me, zmq.SNDMORE)       # New
        socket.send(empty, zmq.SNDMORE)    # New
        socket.send(toAddr, zmq.SNDMORE)
        socket.send(empty, zmq.SNDMORE)
        socket.send("Reply to %s" % str(req))

路由器到REP套接字是无效的组合,如下所述:http://zguide.zeromq.org/page:all#Request-Reply-Combinations

相关问题 更多 >

    热门问题