Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python发布时订阅不起作用_Python_Node.js_Zeromq_Publish Subscribe - Fatal编程技术网

从Python发布时订阅不起作用

从Python发布时订阅不起作用,python,node.js,zeromq,publish-subscribe,Python,Node.js,Zeromq,Publish Subscribe,原来的问题是: 嗨 如果我从Node.js订阅Python中的发布服务器,订阅服务器将无法接收消息。另一方面,节点发布者可以同时发送python订阅服务器和节点订阅服务器,python发布者可以发送python订阅服务器 节点订户: // Generated by LiveScript 1.4.0 (function(){ var zmq, sock; zmq = require('zmq'); sock = zmq.socket('sub'); sock.connect('tc

原来的问题是:

如果我从Node.js订阅Python中的发布服务器,订阅服务器将无法接收消息。另一方面,节点发布者可以同时发送python订阅服务器和节点订阅服务器,python发布者可以发送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);
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
节点发布者:

// 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订户:

// 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);
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

您需要使用一个只有一个参数(即数据)的函数更改用户sock.on call:

发布者代码应该可以在不做任何修改的情况下工作,尽管我更喜欢类似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') 

问题在于PyZMQ和zeromq.node之间的libzmq版本不匹配:

和节点版本:

$ node
> require('zmq').version
'2.2.0'
解决办法是:

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

如果此步骤失败,则需要从以下来源安装libzmq-4.x:

安装zeromq.node:sudo npm安装zmq
等等这段代码不适用于我的笔记本电脑,但适用于RaspberryPi!让我进一步调试…这是一个libzmq版本问题。但是你提到的代码有一个错误,现在已经修复了。非常感谢。