我正在测试ZeroMQ framework异步库消息传递的示例,以便在分布式应用程序中工作,从而实现编程语言之间的互操作性。
我感兴趣的是,从C ++中的客户端应用程序,我可以发送消息,这是在python中的服务器应用程序中接收的。
为了达到这个目的,我使用以下样本:
C ++中的客户端应用程序名为hwclient.cpp
和is 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.py
和is 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 ++应用程序客户端中看不到服务器的回复?
答案 0 :(得分:1)
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。
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;
输出。
因为您没有尝试显示它。
那很简单。
如果您仍然怀疑,可以尝试将其再次发送回服务器并将其打印/匹配在那里以查看它是否已完全交付(参考A)以及它已交付正确(参考B)上面)
Q.E.D。
答案 1 :(得分:0)
根据@user3666197的答案和评论,我对零mQ方面没有任何不便。
而不是它,我应该使用C ++来解决这个问题。
我想显示从ptyhon服务器到c ++客户端的返回消息。
因此,我的c ++客户端到达了消息的有效负载,但我应该对响应进行一些转换或转换,然后将消息显示为字符串。
然后我的c ++客户端将以这种方式接收python服务器响应:
{{1}}
通过这种方式,我可以在text plain
中查看来自服务器的响应