如何在Python发布者和C ++订阅者之间实现简单的ZeroMQ Pub-Sub通信?

时间:2017-11-23 08:13:33

标签: python c++ zeromq

我是ZMQ的新手,并尝试在Python发布者和C ++订阅者之间实现简单的Pub-Sub通信。根据官方文档,我提出了这些代码:

Python Publisher

import zmq
import datetime

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

while True:
    now = datetime.datetime.now()
    nowInMicroseconds = str(now.microsecond)
    socket.send_string(nowInMicroseconds)
    print("sending time in microseconds")

C ++订阅者

#include <zmq.hpp>
#include <iostream>

int main ()
{
    zmq::context_t context (1);
    zmq::socket_t subscriber (context, ZMQ_SUB);
    subscriber.connect("tcp://127.0.0.1:5555");
    subscriber.setsockopt(ZMQ_SUBSCRIBE, "");

    while(true) {   
        std::cout << "Getting data" << std::endl;
        zmq::message_t update;
        subscriber.recv(&update);
        std::cout << "Data received" << std::endl;

    }
}

但是当我运行代码时,我不会从Python接收任何数据。我做错了什么?

编辑

使用Python订阅者运行Python Publisher user3666197建议工作得很好。使用C ++订阅服务器运行C ++ Publisher就像魅力一样。

1 个答案:

答案 0 :(得分:1)

首先,让我们找出问题所在:

在python中再创建 .connect() 的另一个订阅者:

import zmq
import datetime

pass;      Pcontext = zmq.Context()
Psocket  = Pcontext.socket( zmq.SUB )

Psocket.connect( "tcp://127.0.0.1:5555" )

Psocket.setsockopt( zmq.LINGER,     0 )
Psocket.setsockopt( zmq.SUBSCRIBE, "" )
Psocket.setsockopt( zmq.CONFLATE,   1 )

while True:
    print( "{1:}:: Py has got this [[[{0:}]]]".format( Psocket.recv(),
                                                       str( datetime.datetime.now()
                                                            )
                                                       )
            )

如果这按预期工作,问题不在发件人方面。 如果失败,可以在不同平台上检查正确的订阅字符串处理问题(期望在Py 3+上 u'' )。