Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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
ZeroMQ PUB-SUB通信:SUB未接收任何内容 我试图在ZeOMQ中获得一个PUB-SUB通信,在那里,PUB处于C++中,Python中的子。我使用的是python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1和cppzmq 4.5.0_C++_Python 3.x_Zeromq_Python - Fatal编程技术网

ZeroMQ PUB-SUB通信:SUB未接收任何内容 我试图在ZeOMQ中获得一个PUB-SUB通信,在那里,PUB处于C++中,Python中的子。我使用的是python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1和cppzmq 4.5.0

ZeroMQ PUB-SUB通信:SUB未接收任何内容 我试图在ZeOMQ中获得一个PUB-SUB通信,在那里,PUB处于C++中,Python中的子。我使用的是python 3.8、ZeroMQ 4.3.2、pyzmq 18.1.1和cppzmq 4.5.0,c++,python-3.x,zeromq,python,C++,Python 3.x,Zeromq,Python,酒吧: 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

酒吧:

    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发送消息时没有错误。实际上,它返回发送消息的长度

注:

  • 睡眠是为了试验,以便能够在酒吧发送之前启动SUB。但是如果我移除它并首先启动SUB,我会有同样的行为
  • 如果执行以下操作,它将打印
    none
我是ZeroMQ的新手,我真的不知道从哪里开始解决这个问题。有什么想法吗

Q:有什么想法吗

如果您从未使用过ZeroMQ,
您可能会喜欢在深入了解更多细节之前先看一看

步骤-1:,以便正确定义
,并验证其在
中断
条件下的正确使用,以避免立即从发送循环中中断


第0步:另一方面,将ZeroMQ
子项设置为首先订阅任何主题,使用
”作为主题筛选器显式设置的字符串如果有效:您的问题被隔离到正确的主题设置中,以便实际执行主题筛选如果没有:您似乎也有视线“可见性”问题(当您不在同一台
本地主机上时,可能会发生这种情况(是的,有时在这里也会发生))。

我没有快速的方法检查您的工作,但我可以给您一些基本的提示,让您解决问题

  • 我建议您开始拆除接收器侧的过滤器。为此,您必须将
    setsockopt
    替换为类似于
    socket.setsockopt_字符串(zmq.SUBSCRIBE,“”)

  • 此外,始终在接收方,我建议您只打印您正在接收的内容,而不对数据做任何假设,因此我将使用简单的
    打印(socket.recv_string())
    (甚至是
    打印(socket.recv())

  • 您的简单(调试)接收器如下所示:

    导入zmq
    context=zmq.context()
    socket=context.socket(zmq.SUB)
    插座。连接(“tcp://localhost:5556")
    socket.setsockopt_字符串(zmq.SUBSCRIBE,“”)
    data=socket.recv_string()
    打印(数据)
    
    通过这种方式,您可以了解通过套接字发送的是什么(如果有)

    如果收到的内容不是您期望的,那么您可以在发送方工作。例如,您可以查看
    socket.send()
    ZMQ\u SNDMORE
    标志,该标志允许您创建多部分消息。(有关“主题筛选”的工作原理,请参阅文档)


    如果您仍然需要帮助,明天我可能会更彻底地看一看。

    感谢大家的回答。我发现这是一个典型的“慢接合”问题。我在循环之前移动了睡眠(10),以查看发生了什么,它起了作用


    我的第一条消息中有什么不清楚的地方(因为有人过度清理了我的代码以便在这里澄清)fValue要么设置为一个数字,在循环中有一定数量的交互,要么设置为0,无限循环。因此,我将其设置为3,只是为了发送几条消息,但发布方没有足够的时间连接到SUB,以便SUB看到消息。

    添加了+1,用于引用所有发布版本。包括ZeroMQ,这是软件工程的良好标志不熟练的手艺
    Err = socket.connect("tcp://localhost:5556")
    print(Err)