我正在尝试订阅pub-sub服务器。 使用Python执行此操作时没有问题,它的工作方式与预期的一样。 但是,当我尝试使用NodeJS ZMQ订阅完全相同的服务器时,没有任何反应。 我无法弄清楚哪里出了问题,可能是在订阅部分?
的Python:
from gzip import GzipFile
from cStringIO import StringIO
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:6701")
socket.setsockopt(zmq.SUBSCRIBE, '')
while True:
multipart = socket.recv_multipart()
address = multipart[0]
contents = ''.join(multipart[1:])
contents = GzipFile('','r',0,StringIO(contents)).read()
print("[%s] %s\n" % (address, contents))
socket.close()
context.term()
的NodeJS:
var zmq = require('zmq')
, sock = zmq.socket('sub');
sock.connect('tcp://127.0.0.1:6701');
sock.subscribe('');
console.log('Subscriber connected to port 6701');
sock.on('message', function(topic, message) {
console.log('received a message related to:', topic, 'containing message:', message);
});
NodeJS示例中的on-message部分永远不会被触发。 当我运行一个简单的NodeJS发布者时,订阅者就像预期的那样工作。
请注意,我连接的地址是本地IP,因为我为ZeroMQ消息运行了一些本地分发工具。
NodeJS脚本与同一发布源上的Python脚本不同的两个脚本之间有什么区别?
两者都在使用ZeroMQ 4。
修改 正如杰森所建议的,我会发布一些出版商的代码。但因为这是第三方,我没有那个代码。但是,当我启动一个简单的Python发布者时,订阅者的行为与第三方发布者的行为相同。
简单的Python发布者:
import zmq
import random
import sys
import time
port = "6701"
if len(sys.argv) > 1:
port = sys.argv[1]
int(port)
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
topic = random.randrange(9999,10005)
messagedata = random.randrange(1,215) - 80
print "%d %d" % (topic, messagedata)
socket.send("%d %d" % (topic, messagedata))
time.sleep(1)
NodeJS发布者:
var zmq = require('zmq')
, sock = zmq.socket('pub');
sock.bindSync('tcp://127.0.0.1:6701');
console.log('Publisher bound to port 3000');
setInterval(function(){
console.log('sending a multipart message envelope');
sock.send(['kitty cats', 'meow!']);
}, 500);
NodeJS发布者可以使用Python和NodeJS订阅者,但Python发布者只能使用Python订阅者,而不能使用NodeJS订阅者。
答案 0 :(得分:0)
<强>固定。强>
删除node_modules并通过npm install zmq重新安装它。