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

时间:2017-11-03 00:33:04

标签: 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 ++应用程序客户端中看不到服务器的回复?

2 个答案:

答案 0 :(得分:1)

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

REQ/REP 可扩展形式通信模式原型的核心逻辑(实际上是核心,多方分布式逻辑)是硬连线的,因此如果 {{1} } -entity收到 REP -message(除此之外,除了最新的API v4。+微妙的调整,最精确), { {1}} -entity可以(并且在您的代码中) REQ REP -side发送消息。

对称地,在 .send() -entity向 REQ -side发出第一条消息后,它永远不会发送另一个&#34 ;下一个&#34;消息,除非它之前有 REQ -ed REP -side响应。

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

所以这已经解决了,因为确实是一个不正确的假设,Q.E.D。

B)关于未送达消息内容的假设不正确。为什么?

ZeroMQ要么提供完全正确的消息,要么根本不提供任何消息。

这意味着,如果消息已被发送和传递(对于核心分布式逻辑推理,请参见上文),唯一可能的替代方案是,消息有效负载是正确的,因为没有其他选项存在于ZeroMQ框架内部性。

<强>证明:
改变这个:

.recv()

进入这个:

REP

你会直截了当地看到问题出在哪里 - 它不在ZeroMQ工具中,而是代码如何尝试将 // Print the reply, memory address ... std::cout << 'Mostrando reply' << &reply << std::endl; 呈现为 // Print the reply std::cout << 'Mostrando reply was delivered' << std::endl; 输出。

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

因为您没有尝试显示它。

那很简单。

如果您仍然怀疑,可以尝试将其再次发送回服务器并将其打印/匹配在那里以查看它是否已完全交付(参考A)以及它已交付正确(参考B)上面)

Q.E.D。

答案 1 :(得分:0)

根据@user3666197的答案和评论,我对零mQ方面没有任何不便。

而不是它,我应该使用C ++来解决这个问题。

我想显示从ptyhon服务器到c ++客户端的返回消息。

因此,我的c ++客户端到达了消息的有效负载,但我应该对响应进行一些转换或转换,然后将消息显示为字符串。

然后我的c ++客户端将以这种方式接收python服务器响应:

{{1}}

通过这种方式,我可以在text plain

中查看来自服务器的响应