消息未定义和主题成为缓冲区(ZMQ)
Message undefined and topic become buffer (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 变成了缓冲区,而 DATA 是这样未定义的:
Topic <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> Data undefined
如何解决?谢谢
ZeroMQ PUB.send()
-按原样发送消息体:
每个 SUB
端配置的 <aTopicFILTER>
字符串都针对消息正文进行了左侧字符串匹配测试。
所以你的 PUB
方产生了一条消息,至少有一个 SUB
-side 配置 <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 规范,
Q.E.D.
虽然您的代码完全符合预期,但它并没有按照您的意愿进行。您似乎希望它将消息拆分为主题 ('hello'
) 和数据 ('world'
)。
没有发生这种情况的原因是,当您发送消息时,您将主题和数据组合成一个字符串,而您的接收者希望它是一个多部分消息,分成两部分。最简单的解决方案是在您的 Python 服务器中实际生成一条由两部分组成的消息。
因此,替换
socket.send("%s %s" % (topic, messagedata))
和
socket.send_multipart([topic, messagedata])
并且我希望您的系统能够按照您的预期运行。
我想使用 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
如何解决?谢谢
ZeroMQ PUB.send()
-按原样发送消息体:
每个 SUB
端配置的 <aTopicFILTER>
字符串都针对消息正文进行了左侧字符串匹配测试。
所以你的 PUB
方产生了一条消息,至少有一个 SUB
-side 配置 <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 规范,
Q.E.D.
虽然您的代码完全符合预期,但它并没有按照您的意愿进行。您似乎希望它将消息拆分为主题 ('hello'
) 和数据 ('world'
)。
没有发生这种情况的原因是,当您发送消息时,您将主题和数据组合成一个字符串,而您的接收者希望它是一个多部分消息,分成两部分。最简单的解决方案是在您的 Python 服务器中实际生成一条由两部分组成的消息。
因此,替换
socket.send("%s %s" % (topic, messagedata))
和
socket.send_multipart([topic, messagedata])
并且我希望您的系统能够按照您的预期运行。