首页 > 解决方案 > ZeroMQ PUB-SUB 通信:SUB 什么也没收到

问题描述

我正在尝试在 ZeroMQ 中进行 PUB-SUB 通信,其中 PUB 在 C++ 中,SUB 在 python 中。我正在使用 python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1 和 cppzmq 4.5.0

酒馆 :

    int main()
    {
        Sleep(10000);

        zmq::context_t context(1);
        zmq::socket_t publisher(context, ZMQ_PUB);
        publisher.bind("tcp://*:5556");         

        int zipcode, temperature, relhumidity;
        while (true) {      

            //  Get values (first supposed to be random)
            zipcode = 10001;
            temperature = 27;
            relhumidity = 61;

            //  Send message to the subscriber
            zmq::message_t message(20);
            snprintf((char *)message.data(), 20, "%05d %d %d", zipcode, temperature, relhumidity);
            publisher.send(message, zmq::send_flags::none);

            std::fprintf(stderr, "[INFO] Sent data: %i, %i, %i \n", zipcode, temperature, relhumidity);

            if (fValue && j >= fValue) {
                break;
            }
            j++;
        }
    }

子:

import sys
import zmq

#  Socket to talk to server
context = zmq.Context() 
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5556")

# Subscribe to zipcode, default is NYC, 10001
zip_filter = "10001"

# Python 2 - ascii bytes to unicode str
if isinstance(zip_filter, bytes):
    zip_filter = zip_filter.decode('ascii')
socket.setsockopt_string(zmq.SUBSCRIBE, zip_filter)

# Process 5 updates
for update_nbr in range(3):
    string = socket.recv_string()

    zipcode, temperature, relhumidity = string.split()
    print("Received data : %s , %d , %d" % (zip_filter, temperature, relhumidity))

但是我无法让它工作,因为 SUB 一直在等待,string = socket.recv_string()而 PUB 发送消息没有错误。实际上,它返回已发送消息的长度。

备注:

Err = socket.connect("tcp://localhost:5556")
print(Err)

我是 ZeroMQ 的新手,我真的不知道从哪里开始解决这个问题。任何的想法 ?

标签: c++python-3.xzeromq

解决方案


有什么想法吗?

如果您从未使用过 ZeroMQ,
那么您可能会喜欢先看看“ZeroMQ原则在不到5 秒内,然后再深入了解更多细节


步骤-1: 修复您的 端代码,以便正确定义 thej和 thefValue并验证其在break-condition 中的正确用法,以避免立即break从发送循环中退出。

第 0 步:端,将 ZeroMQ 设置SUB为首先订阅任何主题,使用""- 作为主题过滤器的显式设置的字符串。如果可行:您的问题与实际进行主题过滤的正确主题设置隔离。如果不是:您似乎也有视线“可见性”问题(当不在同一位置时可能会发生localhost(是的,这有时也会发生在这里))。


推荐阅读