ZeroMQ通信

您所在的位置:网站首页 socket三种类型 ZeroMQ通信

ZeroMQ通信

2023-05-26 01:38| 来源: 网络整理| 查看: 265

最近项目中需要用到zmq通信,本文中提供了几个demo,便于快速熟悉使用zmq。

1.Ubuntu下利用cmake编译zeromq库

https://blog.csdn.net/fangye945a/article/details/84845325 https://blog.csdn.net/locahuang/article/details/116011417

2.使用zmq进行通信

  ZMQ将消息通信分成4种模型:

一对一结对模型(Exclusive-Pair),可以认为是一个TCP Connection,但是TCP Server只能接受一个连接。数据可以双向流动,这点不同于后面的请求回应模型。请求回应模型(Request-Reply),由Client发起请求,并由Server响应,跟一对一结对模型的区别在于可以有多个Client。发布订阅模型(Publish-Subscribe),Publish端单向分发数据,且不关心是否把全部信息发送给Subscribe端。如果Publish端开始发布信息时,Subscribe端尚未连接进来,则这些信息会被直接丢弃。Subscribe端只能接收,不能反馈,且在Subscribe端消费速度慢于Publish端的情况下,会在Subscribe端堆积数据。管道模型(Push-Pull),从 PUSH 端单向的向 PULL 端单向的推送数据流。如果有多个PULL端同时连接到PUSH端,则PUSH端会在内部做一个负载均衡,采用平均分配的算法,将所有消息均衡发布到PULL端上。与发布订阅模型相比,管道模型在没有消费者的情况下,发布的消息不会被消耗掉;在消费者能力不够的情况下,能够提供多消费者并行消费解决方案。该模型主要用于多任务并行。 这4种模型总结出了通用的网络通信模型,在实际中可以根据应用需要,组合其中的2种或多种模型来形成自己的解决方案。 zmq通信示例

  以下是一个zmq服务端和zmq客户端的通信示例

服务端:

#include #include int main(int argc, char ** argv) { std::cout zmq::context_t context(1); zmq::socket_t socket(context, zmq::socket_type::rep); socket.bind("tcp://*:5555"); while (true) { zmq::message_t request; socket.recv(&request); json j = json::parse(static_cast(request.data())); std::string name = j["name"]; int age = j["age"]; std::cout zmq::context_t context(1); zmq::socket_t socket(context, ZMQ_REP); socket.bind("tcp://*:5555"); while (true) { zmq::message_t request; socket.recv(&request); string filename = string(static_cast(request.data()), request.size()); cout zmq::context_t context(1); zmq::socket_t socket(context, ZMQ_REQ); socket.connect("tcp://localhost:5555"); string filename = "test.txt"; zmq::message_t request(filename.size()); memcpy(request.data(), filename.c_str(), filename.size()); socket.send(request); zmq::message_t reply; socket.recv(&reply); string replystr = string(static_cast(reply.data()), reply.size()); if (replystr == "NF") { cout zmq::message_t zmq_send_msg(sizeof(SendDataType)); double position_time_interval = ratio_msg.sample_period / (ARM_POSITION_NUM - 1); std::cout zmq::message_t zmq_receive_msg(sizeof(ReceiveDataType)) ; ReceiveDataType *data_ptr ; while(ros::ok()){ zmq_recv(socket_receive_,zmq_receive_msg.data(),sizeof(ReceiveDataType),0); if(zmq_receive_msg.empty()){ continue; } data_ptr = zmq_receive_msg.data(); //if(data_ptr->success){ PublishSocketReceivedMsg(*data_ptr, true); //} data_ptr->success = false; } }

服务端:

#include #include int main(int argc, char** argv) { // zmq transfer file std::ofstream fout("caliberation_result.txt"); zmq::context_t context(1); zmq::socket_t socket(context, ZMQ_REP); socket.bind("tcp://172.168.2.130:5555"); while (true) { zmq::message_t request; socket.recv(&request); std::string filename = std::string(static_cast(request.data()), request.size()); std::cout zmq::context_t zmq_context_; zmq::socket_t zmq_socket_; zmq_context_ = zmq::context_t(1); zmq_socket_ = zmq::socket_t(zmq_context_, ZMQ_REQ); board_addr_ = "tcp://172.168.2.130:5555"; zmq_socket_.connect(board_addr_); std::string filename = "test.log"; zmq::message_t request(filename.size()); memcpy(request.data(), filename.c_str(), filename.size()); socket.send(request); zmq::message_t reply; socket.recv(&reply); std::string replystr = std::string(static_cast(reply.data()), reply.size()); if (replystr == "NF") { qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3