【问题标题】:Subscribe is not working while publishing from Python从 Python 发布时订阅不起作用
【发布时间】:2015-08-03 01:06:56
【问题描述】:

原来的问题在这里:https://github.com/JustinTulloss/zeromq.node/issues/444

你好,

如果我从 Node.js 订阅 Python 中的发布者,订阅者将无法接收消息。另一方面,Node-publisher 可以同时发送 python-subscriber 和 node-subscriber,python-publisher 可以发送 python 订阅者。

节点订阅者:

// Generated by LiveScript 1.4.0
(function(){
  var zmq, sock;
  zmq = require('zmq');
  sock = zmq.socket('sub');
  sock.connect('tcp://127.0.0.1:3000');
  sock.subscribe('');
  console.log('Subscriber connected to port 3000');
  sock.on('message', function(message){
    return console.log('Received a message related to: ', 'containing message: ', message.toString());
  });
}).call(this);

节点发布者:

// Generated by LiveScript 1.4.0
(function(){
  var zmq, sock;
  zmq = require('zmq');
  sock = zmq.socket('pub');
  sock.bindSync('tcp://127.0.0.1:3000');
  console.log('Publisher bound to port 3000');
  setInterval(function(){
    console.log('Sending a multipart message envelope');
    return sock.send('TestMessage(node)!');
  }, 1500);
}).call(this);

Python 发布者

import zmq
import time

context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://127.0.0.1:3000")

while True:
    time.sleep(1)
    publisher.send("TestMessage")
    print "Sent"

Python 订阅者:

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)

socket.setsockopt(zmq.SUBSCRIBE, "")
socket.connect("tcp://127.0.0.1:3000")

while True:
    string = socket.recv()
    print string

【问题讨论】:

    标签: python node.js zeromq publish-subscribe


    【解决方案1】:

    您需要更改订阅者sock.on() 调用,使用只有一个参数的函数(即data):

    (function(){
      var zmq, sock;
      zmq = require('zmq');
      sock = zmq.socket('sub');
      sock.connect('tcp://127.0.0.1:3000');
      sock.subscribe('');
      console.log('Subscriber connected to port 3000');
      sock.on('message', function(data){
        return console.log('New message: ', data.toString());
      });
    }).call(this); 
    

    发布者代码无需任何修改即可工作,尽管我更喜欢类似(Python 3 兼容):

    import time                                                                     
    
    context = zmq.Context()                                                         
    publisher = context.socket(zmq.PUB)                                             
    publisher.bind("tcp://127.0.0.1:3000")                                          
    
    while True:                                                                     
        time.sleep(1)                                                               
        publisher.send(bytearray('test', 'ascii'))                                  
        print('Sent test message') 
    

    【讨论】:

    • 等一下!此代码不适用于我的笔记本电脑,但适用于 RaspberryPi!让我进一步调试...
    • 这是一个 libzmq 版本问题。但是您提到的代码有错误,现在也已修复。谢谢。
    【解决方案2】:

    问题是PyZMQzeromq.node之间的libzmq版本不匹配:

    $ python 
    >>> import zmq
    >>> zmq.zmq_version()
    '4.0.5'
    

    和节点版本:

    $ node
    > require('zmq').version
    '2.2.0'
    

    解决办法是:

    1. 卸载当前版本的 libzmq:sudo apt-get purge libzmq-dev
    2. 卸载当前 zeromq.node:sudo npm uninstall zmq -g
    3. 安装 libzmq-4.x:sudo apt-get install libzmq3-dev

      如果此步骤失败,则需要从源安装 libzmq-4.x:https://github.com/zeromq/libzmq

    4. 安装 zeromq.node:sudo npm install zmq

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      相关资源
      最近更新 更多