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



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

这是代码:

pub.py

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

var zmq = require ('zeromq')
var sock = zmq.socket ('sub');
sock.connect('tcp://127.0.0.1:3001');
sock.subscribe('hello');
console.log('Subscriber connected to port 3001');
sock.on('message', function(topic, messagedata) {
console.log('TOPIC', topic, 'DATA', messagedata);
});

但结果是,TOPIC 变成了一个缓冲区,DATA 是未定义的,如下所示:

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

如何解决?谢谢

虽然你的代码完全按照预期做了,但它并没有做你想要它做的事情。似乎您希望它将消息拆分为主题('hello')和数据('world')。

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

因此,替换

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

socket.send_multipart([topic, messagedata])

我希望您的系统能够按您的预期工作。

ZeroMQ 按原样PUB.send()-s 消息正文:

每个SUB端配置的<aTopicFILTER>字符串都经过左侧字符串与消息正文匹配的测试。

所以你的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.E.D
完全匹配。

最新更新