ZeroMQ Python订阅有效,NodeJS订阅不在同一个发布者上

时间:2015-07-08 19:14:38

标签: python node.js zeromq publish-subscribe

我正在尝试订阅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订阅者。

1 个答案:

答案 0 :(得分:0)

<强>固定。

删除node_modules并通过npm install zmq重新安装它。