【问题标题】:How to implement simple ZeroMQ Pub-Sub communication between Python publisher and C++ subscriber?如何在 Python 发布者和 C++ 订阅者之间实现简单的 ZeroMQ Pub-Sub 通信?
【发布时间】:2017-11-23 08:13:33
【问题描述】:

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

Python 发布者

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 的任何数据。我做错了什么?

编辑

user3666197 建议的方式运行带有 Python 订阅者的 Python Publisher 可以正常工作。使用 C++ 订阅者运行 C++ Publisher 就像魅力一样。

【问题讨论】:

  • 你发现了吗?

标签: python c++ zeromq


【解决方案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'')。

【讨论】:

  • 使用你的python代码,它按预期工作,带有发送值的“Py has got this”被写入控制台。
  • Q.E.D. -- 问题出在订阅匹配问题上。因此,要么 C++ 向 python 提供一个 unicode 格式的字符串,要么选择让双方使用相同的字符串约定。也可能已经注意到,最初的 ZeroMQ API 版本正在运行 SUB 端主题过滤,决定在 SUB 端传递的消息,而最近的 API(3.2+ IIRC)已经进入 PUB 端主题过滤, 不匹配的字符串约定可能会导致麻烦。
  • 代码正常运行。在运行 Python Publisher-Python Subscriber 和 C++ Publisher - C++ Subscriber 测试后,我用原始代码进行了另一次尝试,它工作得很好。之所以?我仍然不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多