消息未定义,主题成为缓冲区(ZMQ)

2024-03-29 15:38:51 发布

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

我想使用ZeroMQ进行发布和订阅。我使用python作为发布者,node js作为订阅服务器。在

代码如下:

出版物

import zmq
import random
import sys
import time

port = "3001"
if len(sys.argv) > 1:
    port =  sys.argv[1]
    int(port)

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://127.0.0.1:3001")
while True:
    topic = "hello"
    messagedata = "world"
    print "%s %s" % (topic, messagedata)
    socket.send("%s %s" % (topic, messagedata))
    time.sleep(1)

子js

^{pr2}$

但结果是,TOPIC变成了一个缓冲区,数据是这样未定义的:

Topic <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> Data undefined

如何解决?谢谢你


Tags: import服务器nodetopictimeportsyscontext
2条回答

ZeroMQPUB.send()-s原样的消息体:

每一个SUB-side配置的<aTopicFILTER>-string的左侧字符串是否与消息正文匹配。在

因此,您的PUB侧产生了一条消息,至少有一个SUB-侧配置了<aTopicFILTER>-字符串(这里"hello"被设置/匹配)。在

因此,这样的消息被正确地传递到SUB进行进一步处理:

>>> aTupleOfBYTEs = ( '\x68', '\x65', '\x6c', '\x6c', '\x6f', '\x20', '\x77', '\x6f', '\x72', '\x6c', '\x64' )
>>> aTupleOfBYTEs
('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')
>>> print "".join( aTupleOfBYTEs )
hello world

与发布的ZeroMQ API规范完全匹配,
Q、 急诊室

虽然您的代码确实执行了预期的操作,但它并没有执行您希望它执行的操作。您似乎希望它将消息拆分为主题('hello')和数据('world')。在

这种情况不会发生的原因是,当您发送消息时,您将主题和数据组合到一个字符串中,而接收者希望它是一个分为两部分的多部分消息。最简单的解决方案是在Python服务器中实际生成一个由两部分组成的消息。在

因此,更换

    socket.send("%s %s" % (topic, messagedata))

^{pr2}$

我希望你的系统能如你所愿工作。在

相关问题 更多 >