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

Posted

技术标签:

【中文标题】ZeroMQ Python 订阅有效,NodeJS 订阅不在同一个发布者上【英文标题】:ZeroMQ Python Subscription works, NodeJS Subscription does not on same publisher 【发布时间】:2015-07-08 19:14:37 【问题描述】:

我正在尝试订阅发布-订阅服务器。 使用 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。

编辑: 正如 Jason 所建议的,我会发布一些发布者的代码。但是因为这是第 3 方,所以我没有那个代码。但是当我启动一个简单的 Python 发布者时,订阅者的行为与他们在 3rd 方发布者上的行为相同。

简单的 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 订阅者。

【问题讨论】:

只是想消除变量,你能显示你的python发布者和节点发布者的相关代码吗? 【参考方案1】:

已修复。

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

【讨论】:

以上是关于ZeroMQ Python 订阅有效,NodeJS 订阅不在同一个发布者上的主要内容,如果未能解决你的问题,请参考以下文章

zeromq学习记录订阅发布消息封装

ZeroMQ/NanoMsg 发布/订阅与多播

PyZMQ ( ZeroMQ ) - 如何从 SUB 套接字获取订阅密钥?

zeromq:c,c++,golang及nodejs使用

zeromq中的懒惰发布/订阅,只获取最后一条消息

ZeroMQ_04 发布订阅模式