2015-08-03 2 views
1

оригинальный вопрос здесь: https://github.com/JustinTulloss/zeromq.node/issues/444Подписаться не работает при публикации из Python

Привет,

Если я подписываюсь с Node.js издателю в Python, абонент не может получать сообщения. С другой стороны, издатель Node может отправлять как подписчиков 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); 

Node издатель:

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

ответ

1

Проблема является несоответствие версии libzmq между PyZMQ и zeromq.node:

$ 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. Uninstall тока 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
2

Вы должны изменить вызов абонента 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') 
+0

Нет, это не работает, либо ... – ceremcem

+0

держись! Этот код не работает на моем ноутбуке, но работает на RaspberryPi! Позвольте мне отлаживать далее ... – ceremcem

+1

Это была проблема версии libzmq. Но была ошибка с кодом, который вы упомянули, и теперь он исправлен. Спасибо. – ceremcem