python - ZeroMQ Hello World 客户端 - 服务器。来自服务器的回复显然没有到达

标签 python c++ zeromq

我正在测试 ZeroMQ framework 的示例异步库消息传递在分布式应用程序中工作,实现编程语言之间的互操作性。

我感兴趣的是,我可以从 C++ 的客户端应用程序发送一条消息,并在 python 的服务器应用程序中接收到该消息。

为了实现这个目标,我使用了以下示例:

C++ 中的客户端应用程序名为hwclient.cppis based in this code:

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

int main ()
{
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REQ);

    std::cout << "Connecting to hello world server…" << std::endl;
    socket.connect ("tcp://localhost:5555");

    //  Do 10 requests, waiting each time for a response
    for (int request_nbr = 0; request_nbr != 10; request_nbr++) {
        zmq::message_t request (5);
        memcpy (request.data (), "Boti", 5);
        std::cout << "Sending " << request_nbr << "…" << std::endl;
        socket.send (request);

        //  Get the reply.
        zmq::message_t reply;
        socket.recv (&reply);

        // Print the reply, memory address ...
        std::cout << 'Mostrando reply' << &reply << std::endl;

        std::cout << "Received from server " << request_nbr << std::endl; reply;
    }
    return 0;
}

python 服务器名为 hwserver.pyis based in this code :

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print("Received request: %s" % message)

    print('hi')

    #  Do some 'work'
    time.sleep(1)

    #  Send reply back to client
    socket.send(b"World")
    print('Response sent')

我使用 g++ hwclient.cpp -o client.out -lzmq 构建 C++ 客户端并执行二进制文件以这种方式从客户端发送消息:

bgarcial@elpug : ~/CLionProjects/ZeroMQ
[0] % ./client.out
Connecting to hello world server…
Sending 0…
17018666170x7ffcbea254d0
Received from server 0
Sending 1…
17018666170x7ffcbea254d0
Received from server 1
Sending 2…
17018666170x7ffcbea254d0
Received from server 2

bgarcial@elpug : ~/CLionProjects/ZeroMQ
[0] % 

在服务器端,Boti 字符串已经到达!

[127] % python HelloWorldServer/zeromq_server.py
Received request: b'Boti\x00'
hi
Response sent
Received request: b'Boti\x00'
hi
Response sent
Received request: b'Boti\x00'
hi
Response sent

但我认为服务器中的代码部分 socket.send(b"World") 没有执行,因为在我的客户端中没有到达 World 字符串。 ..

有没有可能我的 C++ 客户端没有以合适的方式收到回复?

当我用 python 客户端服务器测试 python 服务器时,来自服务器的回复以成功的方式到达客户端 ...

为什么在我的 C++ 应用程序客户端中看不到来自服务器的回复?

最佳答案

A) 关于未传递消息的假设是不正确的。为什么?

REQ/REP Scalable Formal Communication Pattern 原型(prototype)的核心逻辑(实际上是核心,多方分布式逻辑)是硬连线的,所以如果 REP-entity 收到一个 REQ-message(除了一些最近的 API v4.+ 微妙的调整,最准确地说),REP-entity 可以(并且在您的代码中将).send()一条消息到 REQ-side。

对称地,在 REQ 实体向 REP 端发送第一条消息后,它可以永远不要发送另一条“下一条”消息,除非在此之前,.recv()-ed REP-端响应。

这种对称的分布式逻辑意味着,如果您的服务器端代码报告对发送多条消息的肯定确认,它本身就代表了一个肯定的证据,即对方也已发送了每条消息来自服务器的响应。 (对于某些消息丢失的情况,您 may kindly read my other posts on the risks of REQ/REP mutual dead-locks)。

所以这确实是一个不正确的假设,Q.E.D.


B) 关于错误传递的消息内容的假设是不正确的。为什么?

ZeroMQ 要么传递完全正确的消息,要么什么都不传递。

这意味着,如果一条消息已被发送和传递(对于核心分布式逻辑推理,请引用上面的内容),唯一可能的选择是消息有效负载是正确的,因为在ZeroMQ 框架内部结构。

证明:
改变这个:

 // Print the reply, memory address ...
    std::cout << 'Mostrando reply' << &reply << std::endl;

进入这个:

 // Print the reply
    std::cout << 'Mostrando reply was delivered' << std::endl;

你会直接看到问题出在哪里——它不在 ZeroMQ 工具中,而是在你的代码如何尝试将 &reply 呈现到的方式中std::out 输出。


C) 为什么我看不到服务器的回复?

因为你不想表现出来。

就这么简单。

如果您仍然有疑问,可以尝试再次将其发送回服务器并打印/在那里匹配以查看它是否已交付(上面的引用 A))和已交付正确(引用 B)以上)

Q.E.D.

关于python - ZeroMQ Hello World 客户端 - 服务器。来自服务器的回复显然没有到达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47086715/

相关文章:

python - 动态模块导入在 python 中不起作用 - 为什么不呢?

python - 使用pdfkit python在第一页上使用不同的边距

c++ - 在 Visual Studio 中测试时如何覆盖标准 C++ 函数?

java - Jeromq 最大套接字打开问题

python - 计算字符串中的字母数(不是字符,只有字母)

python将PST时间转换为UTC isoformat

c++ - 访问列表项时的 UI 和工作线程同步

c++ - 当线程数增加时,多线程文件 IO 程序的行为不可预测

c++ - ZeroMQ 推/拉

c++ - 使用 ZeroMQ 的 C++ 中的 RPC 框架