Qt进程通信,不推荐使用QSharedMemory和QLocalSocket,而是推荐ZMQ

一、据一位资深的网友说QLocalSocket有问题,共享内存QSharedMemory也有,比如存在多线程问题,不灵活,丢数据等问题都有,而且还占资源。血的教训。后来换成了zmq+protobuf。ZMQ进程内,进程间,机器间(跨电脑)都可以实现通信。

二、推荐使用ZMQ

1、ZeroMQ简称ZMQ

ZMQ(zeromq)被称为史上最快的“消息队列”,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,近乎完美的封装了Socket API,大大简化了编程人员的复杂度。其作为消息中间件,在IPC通信领域应用广泛。

 ZeroMQ号称是“史上最快的消息队列”,基于c语言开发的,实时流处理sorm的task之间的通信就是用的zeroMQ。引用官方说法,ZMQ是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一层封装。ZMQ让编写高性能网络应用程序极为简单和有趣。确实,它跟RabbitMQ,ActiveMQ之类有着相当本质的区别,ZeroMQ根本就不是一个消息队列服务器,更像是一组底层网络通讯库。

2、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可以基于多种传输协议进行通信,包括TCP、UDP、in-process(进程内通信)等。ZMQ提供进程内(inproc://)、进程间(ipc://)、机器间(tcp://)、广播(pgm://)等四种通信协议。

创建一个消息流 

int zmq_bind (void *socket, const char *endpoint);

int zmq_connect (void *socket, const char *endpoint);

bind函数是将socket绑定到本地的端点(endpoint),而connect函数连接到指定的peer端点。

endpoint支持的类型:

void* context = zmq_ctx_new();
void* responder = zmq_socket(context, ZMQ_REP);
int rc = zmq_bind(responder, "inproc://hello");
assert(rc == 0);void* client = zmq_socket(context, ZMQ_REQ);
zmq_connect(client, "inproc://hello");int rc = zmq_bind(socket, "ipc:///tmp/feeds/0");
assert (rc == 0);int rc = zmq_connect(socket, "ipc:///tmp/feeds/0");
assert (rc == 0);void *context = zmq_ctx_new ();
void *responder = zmq_socket (context, ZMQ_REP);
int rc = zmq_bind (responder, "tcp://*:5555");
assert (rc == 0);void *context = zmq_ctx_new ();
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");

3、ZMQ处理进程内通信的原理

其实就是线程之间通过两个队列来交互,对于每个线程来说都是通过其中一个队列发消息给对方,从另一个队列中读取对方发送的消息。zmq所做的就是把pipe绑定到对应的线程上,然后在send和recv的时候通过pipe来发出、获取信息。

4、ZMQ的服务器端和客户端的启动没有固定的先后顺序。‌

ZMQ的设计允许服务器端和客户端在启动时没有固定的先后顺序。这意味着,无论是服务器端还是客户端,都可以首先启动。这种设计提供了更大的灵活性,使得系统的部署和扩展更加方便。

具体来说:

‌服务器端‌可以首先启动,通过调用zmq_bind函数绑定到指定的地址,并开始监听连接。一旦服务器端启动并准备好,它就可以等待客户端的连接请求。
‌客户端‌也可以在服务器端之前启动,通过调用zmq_connect函数尝试连接到服务器。如果服务器尚未启动,客户端的连接请求会在后台异步重试,直到成功连接到服务器。

5、ZMQ编译

ZMQ 是一个高性能, 易使用, 易配置的 Socket 库, 在 linux 里面一句命令能够安装, 但是其 windows 版本安装, 要使用cmake手动编译。

6、官网

https://zeromq.org/

https://github.com/zeromq/libzmq

c语言封装

https://github.com/zeromq/czmq

c++语言封装

https://github.com/zeromq/cppzmq

---

参考文献

Qt网络编程-ZMQ的使用_qt zmq-CSDN博客

【Qt 学习之路】在 Qt 使用 ZeroMQ_qt zeromq-CSDN博客

https://www.cnblogs.com/chenny7/p/6245236.html

 https://zhuanlan.zhihu.com/p/346230632

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/422003.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑文件怎么加密?文件加密方法介绍

随着数字化时代的到来,电脑文件的安全性问题日益凸显。为了保护个人隐私和企业数据,文件加密成为了一项重要的安全措施。本文将详细介绍几种常见的电脑文件加密方法,帮助你更好地保护自己的数据安全。 超级加密3000 超级加密3000提供了两种主…

F110批量付款如何Debug BTE增强(后台JOB的调试方法)

F110批量付款如何Debug BTE增强(后台JOB的调试方法) SAP系统中的F110(Automatic Payment)是一个常用的付款程序,在实施过程中,也经常会遇到一些运行的错误,而对于此类的错误,通常的…

网络分析仪仪器校准要怎么进行检测?容易出现哪些误差?

当我们使用矢量网络分析仪时,会发现测量数据存在误差。要纠正它,首先要知道矢量网络分析仪的误差来源是什么。 主要有三个方面:漂移误差、随机误差、系统误差。 一、 漂移误差:是由于仪器或测试系统仪器校准之后性能发生变化引起的,主要是温…

uni-app和Node.js使用uni-push2.0实现通知栏消息推送功能

前言 uniapp 提供了 unipush 统一推送服务,但是每次要推送消息的时候都要登陆 Dcloud 开发者后台,有点不方便,运营需要在我们的后台系统就可以完成操作。 效果演示 消息下发流程 名词解释 名词解释通知消息指定通知标题和内容后,由个推 SD…

【STM32】OLED

OLED显示原理 OLED使用的是I2C协议,使用ssd1306芯片对所有灯进行控制,如果一个灯需要一个引脚的话,屏幕分为8页,每页有128列,8行 . 共有128* 88个灯 这样引脚是算不过来的,所以我们使用了ssd1306芯片&…

【深度学习】【图像分类】【OnnxRuntime】【C++】ResNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署前言模型转换--pytorch转onnxWindows平台搭建依赖环境ONNXRuntime推…

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询,包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求,选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…

maven简介

1, 结构化管理项目 如果不用maven,研发拿到一个项目要去查看代码,了解其代码结构,了解其依赖文件,jar包位置,图片等文件存储路径等;而maven是规范地将对应的源代码、依赖文件等定义其固定位置&…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):7106 标注数量(xml文件个数):7106 标注数量(txt文件个数):7106 标注…

[环境配置]ubuntu20.04安装后wifi有图标但是搜不到热点解决方法

最近刚入手一台主机,暗影精灵8plus电竞主机,安装ubuntu后wifi怎么都搜不到热点,前后重装系统6次才算解决问题。这个心酸历程只有搞技术人才明白。下面介绍我解决过程。 首先主机到手后是个windows10系统,我用无线网连接了一下&am…

Java发邮件:如何配置SMTP服务器实现发信?

Java发邮件功能实现的教程?Java发邮件的方式有哪些? 无论是用于用户注册确认、密码重置,还是系统通知,Java发邮件都是不可或缺的一部分。AokSend将详细介绍如何配置SMTP服务器,以便在Java发邮件时能够顺利发送邮件。 …

Ozon数据插件,Ozon数据插件好用吗

在跨境电商的浩瀚星海中,每一位卖家都像是航行者,不断探索着市场的奥秘与机遇。而在这个过程中,一款高效、精准的数据分析工具,无疑是每位船长手中的罗盘与望远镜。今天,我们就来深入探讨一款备受瞩目的跨境电商辅助神…

可提示 3D 分割研究里程碑!SAM2Point:SAM2加持泛化任意3D场景、任意提示!

郑重声明:本解读已获得论文作者的原创解读授权 文章链接:https://arxiv.org/pdf/2408.16768 在线demo: https://huggingface.co/spaces/ZiyuG/SAM2Point code链接:https://github.com/ZiyuGuo99/SAM2Point 亮点直击 无投影 3D 分割&#xff1…

安装Anaconda(过程)

Anaconda是一个开源的Python发行版本,用来管理Python相关的包,安装Anaconda可以很方便的切换不同的环境,使用不同的深度学习框架开发项目,本文将详细介绍Anaconda的安装。 一、安装 1、安装方式 官网:“https://www.…

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球,把alpha Conterbution调到-1,勾选matte surface启用蒙版物体。

Xshell在password登录时弹出public key登录验证,设置修改方法

1、cloudpods创建虚拟机 2、XShell连接虚拟机 这里点击连接之后出现了下面页面: 3、原因 /etc/ssh/sshd_config.d 这个目录有配置文件默认配置中 “PasswordAuthentication no”导致连不上了 4、解决办法 点击下面截图中的序号1,进入虚拟机内部&…

(java+Seleniums3)自动化测试实战2

1.环境问题点 此时,可以成功打开浏览器 此时,selenium可以控制浏览器 get--就是访问的意思 将驱动复制在当前项目之下 复制驱动的路径 2.基本元素定位 使用id来定位: 使用Name来定位: 成功: 使用id是唯一的&#xff0c…

AI产品经理:2024年职场发展的新机遇

前言 这两年,AI 骤然“火”了起来,可谓出现了重大“转折”。就在这短短两年间,全球各大“大厂”几乎在同一时间争先恐后地跟进 AI 技术。从 ChatGPT 发布起,谷歌、Facebook、亚马逊等纷纷紧跟其后,国内的百度、腾讯、…

STM32的IAP原理及其操作流程分析

首先明确几个基础概念: 下图的start是程序存放在单片机内部flash的起始地址,size是你给你程序留的flash大小。 一般我们会去找对应map文件,可以查看程序占用多少kb,由下图可见我们的程序占用flash的空间为8.14kb。因此起码要在flash中给8.14…