给我用C++实现一个 dealer-router 模式 客户端服务端收发的demo
时间: 2024-03-26 21:39:26 浏览: 189
下面是一个使用 C++ 实现 DEALER-ROUTER 模式的 ZeroMQ 客户端和服务端收发消息的示例代码:
服务端代码:
```c++
#include <zmq.hpp>
#include <string>
#include <iostream>
int main () {
// 创建上下文和 ROUTER socket
zmq::context_t context(1);
zmq::socket_t router(context, ZMQ_ROUTER);
router.bind("tcp://*:5555");
// 循环处理消息
while (true) {
zmq::message_t identity;
zmq::message_t message;
router.recv(&identity);
router.recv(&message);
std::cout << "Received message from client: " << std::string(static_cast<char*>(identity.data()), identity.size()) << " " << std::string(static_cast<char*>(message.data()), message.size()) << std::endl;
router.send(identity, ZMQ_SNDMORE);
router.send(message, 0);
}
return 0;
}
```
客户端代码:
```c++
#include <zmq.hpp>
#include <string>
#include <iostream>
int main () {
// 创建上下文和 DEALER socket
zmq::context_t context(1);
zmq::socket_t dealer(context, ZMQ_DEALER);
dealer.setsockopt(ZMQ_IDENTITY, "client", 6);
dealer.connect("tcp://localhost:5555");
// 发送消息
std::string message = "Hello, world!";
dealer.send(message.data(), message.size(), 0);
// 接收回复
zmq::message_t identity;
zmq::message_t reply;
dealer.recv(&identity);
dealer.recv(&reply);
std::cout << "Received reply from server: " << std::string(static_cast<char*>(reply.data()), reply.size()) << std::endl;
return 0;
}
```
在这个示例中,服务端创建了一个 ROUTER socket 并绑定到本地地址,然后循环监听该 socket 上的消息。当有消息到达时,服务端将该消息的发送者标识和内容打印出来,并回复一个相同的消息给发送者。
客户端创建了一个 DEALER socket 并连接到服务端的地址,然后发送一个字符串消息到服务端。然后客户端接收回复,并打印出来。
注意,在 DEALER-ROUTER 模式下,客户端发送的消息不会直接发送给服务端,而是先发送到 DEALER socket,由 DEALER socket 转发给 ROUTER socket,然后 ROUTER socket 再将消息发送给服务端。服务端回复的消息也是先发送到 ROUTER socket,由 ROUTER socket 再转发给 DEALER socket,最终发送给客户端。
阅读全文