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

我想使用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成为一个缓冲区,数据是这样定义的:

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

如何解决? 谢谢

ZeroMQ PUB.send()消息正文:

每个SUB -sideconfiguration的<aTopicFILTER> – string都针对消息体进行左侧string匹配testing。

所以你的PUB side产生了一个消息,至less有一个SUB <aTopicFILTER>configuration了<aTopicFILTER> -string(这里是"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规范完全一致,
QED

虽然你的代码完全符合预期,但它不会做你想做的事情。 看来你希望它把信息分解成一个主题( 'hello' )和数据( 'world' )。

这种情况不会发生的原因是,当你发送消息的时候,你把主题和数据结合成一个string,而你的接收者期望它是一个多部分消息,分成两部分。 最简单的解决scheme是在Python服务器中实际生成一个包含两部分的消息。

因此,更换

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

  socket.send_multipart([topic, messagedata]) 

我希望你的系统能按照你的意图工作。