消息未定义,主题成为缓冲区(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])
我希望你的系统能按照你的意图工作。
- 检测其他Atom包
- Node.js Express App – Rickshaw.Graph.RangeSlider TypeError:$(element).slider不是函数
- mongoDB插入和process.nextTick
- 如何从Node.js中的路由查询string获取数据与Ajax?
- 咕噜(minimatch / glob)文件夹排除
- grunt-spritesmithconfiguration在gruntfile.js上无法正常工作
- 让CouchDB使用node.js
- 如何在Node.js中创build一个API请求响应stream?
- 如何迭代SNMP设备中的对象,并使用预定义规则创build可读输出