消息未定义且主题变为缓冲区(ZMQ)

时间:2017-09-07 03:58:56

标签: python node.js zeromq

我想使用ZeroMQ进行发布和订阅。我使用python作为发布者,使用节点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)

sub.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

如何解决?谢谢

2 个答案:

答案 0 :(得分:1)

虽然您的代码完全符合预期,但它并不能完成您希望它执行的操作。您似乎希望它将邮件拆分为主题('hello')和数据('world')。

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

因此,替换

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

    socket.send_multipart([topic, messagedata])

我希望您的系统可以按照您的意愿运行。

答案 1 :(得分:0)

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

每个 SUB - 配置的<aTopicFILTER> - 字符串都会针对邮件正文进行左侧字符串匹配测试。

因此,您的 PUB -side已生成一条消息,其中包含至少一个 SUB - 已配置{{1 } - 字符串(此处<aTopicFILTER>已设置/匹配)。

因此,此类消息已正确传递至 "hello" 以进行进一步处理:

SUB

与已发布的ZeroMQ API规范完全匹配,
Q.E.D。