我正在测试 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++ 应用程序客户端中看不到来自服务器的回复?
最佳答案
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/