当前位置: 首页 > news >正文

Qt网络编程-ZMQ的使用

不同主机或者相同主机中不同进程之间可以借助网络通信相互进行数据交互,网络通信实现了进程之间的通信。比如两个进程之间需要借助UDP进行单播通信,则双方需要知道对方的IP和端口,假设两者不在同一主机中,如下示意图:

主机1中的进程A想要与主机2中的进程B进行通信,则首先他们之间需要知道对方所在主机的IP地质以及对方所绑定的端口,好比A和B住在同一个小区(同一个局域网内),A派人给B送信则需要制度B所住的楼栋(主机IP地址)以及B的门牌号(绑定的IP地址)。

不同主机之间的不同进程可以借助网络套接字进行通信,同主机内也是如此,关于进程间通信我之前也写过对应博客:

linux消息队列的简单使用_linux消息队列发送消息为0-CSDN博客

QLocalSocket、QLocalServer实现本地进程通信简单实例_qt vs2015 进程间通信-CSDN博客

这里使用TCP或者UDP进行同一主机内通信也是没有问题的,比如同主机内不同进程使用UDP套接字进行通信,两者可以根据都绑定本机IP127.0.0.1,然后各自根据配置文件绑定不同端口,最后通过QUdpSocket进行数据交互。使用QTcp也是类似,只不过各进程需要指定对应的服务器和客户端,本地进程间通信如果自己实现我还是推进使用QUdpSocket,因为UDP面向报文,无需建立链接,除了单播还可以广播、组播,而且因为处于同一主机,所以基本不用考虑整个报文丢失的问题。第三方库可以采用ZMQ进行进程间通信

第三方库ZeroMQ(也称为ZMQ)是一个流行的消息传递库,它提供了简单而高效的消息传递模式,用于在应用程序之间进行通信。ZeroMQ(ZMQ)可以基于多种传输协议进行通信,包括TCP、UDP、in-process(进程内通信)等。它提供了不同的传输协议来满足不同的通信需求。

ZMQ下载:

The ZeroMQ project · GitHub

下载之后直接解压:

ZMQ编译:

环境:Windows,Qt515.2,VS2022

使用cmake打开:

 

 

完成之后打开对应生成的目录:

使用VS打开对应工程:

编译对应Debug版和release版的库:

 

等待编译完成:

同样方法编译生成Debug版:

生成动态库对应位置:

动态导入库位置:

在工程引入,文件结构:

ZMQ通信主要有REP/REQ、PUB/SUB、PUSH/PULL三种类型,本文主要介绍第二种PUB/SUB即发布/订阅模式 。

工程文件中引入ZMQ头文件以及库文件:

#引入libzmq头文件和库
INCLUDEPATH += $PWD/zmq/includewin32 {LIBS += -L$$PWD/zmq/libCONFIG(release, debug|release) {LIBS += -llibzmq-v143-mt-4_3_6}CONFIG(debug, debug|release) {LIBS += -llibzmq-v143-mt-gd-4_3_6}
}

发布类ZmqPublisher

头文件:

#ifndef ZMQPUBLISHER_H
#define ZMQPUBLISHER_H#include <QObject>class ZmqPublisher : public QObject {Q_OBJECT
public:explicit ZmqPublisher(QObject *parent = nullptr);~ZmqPublisher();bool bind(quint16 port);signals:public slots:void publishData(const QByteArray &data);private:void *context;void *socket;
};#endif // ZMQPUBLISHER_H

源文件:

#include "zmqpublisher.h"
#include "zmq/include/zmq.h"
#include <QDebug>ZmqPublisher::ZmqPublisher(QObject *parent) : QObject{parent} {context = zmq_ctx_new();socket = zmq_socket(context, ZMQ_PUB);
}ZmqPublisher::~ZmqPublisher() {zmq_close(socket);zmq_ctx_destroy(context);
}bool ZmqPublisher::bind(quint16 port) {QString arg = QString("tcp://*:%1").arg(port);int rc = zmq_bind(socket, arg.toUtf8().constData());return rc == 0;
}void ZmqPublisher::publishData(const QByteArray &data) {zmq_send(socket, data, data.size(), 0);
}

订阅类ZmqSubscriber

头文件:

#ifndef ZMQSUBSCRIBER_H
#define ZMQSUBSCRIBER_H#include <QObject>class ZmqSubscriber : public QObject {Q_OBJECT
public:explicit ZmqSubscriber(QObject *parent = nullptr);~ZmqSubscriber();bool connectTo(quint16 port);public slots:void procesMessage();signals:void dataReceived(const QByteArray &data);private:void *context;void *socket;
};#endif // ZMQSUBSCRIBER_H

源文件:

#include "zmqsubscriber.h"
#include "zmq/include/zmq.h"ZmqSubscriber::ZmqSubscriber(QObject *parent) : QObject{parent} {context = zmq_ctx_new();socket = zmq_socket(context, ZMQ_SUB);zmq_setsockopt(socket, ZMQ_SUBSCRIBE, "", 0);
}ZmqSubscriber::~ZmqSubscriber() {zmq_close(socket);zmq_ctx_destroy(context);
}bool ZmqSubscriber::connectTo(quint16 port) {QString arg = QString("tcp://localhost:%1").arg(port);int rc = zmq_connect(socket, arg.toUtf8().constData());return rc == 0;
}void ZmqSubscriber::procesMessage() {while (true) {zmq_msg_t message;zmq_msg_init(&message);zmq_recvmsg(socket, &message, 0);QByteArray data(static_cast<const char *>(zmq_msg_data(&message)),zmq_msg_size(&message));emit dataReceived(data);zmq_msg_close(&message);}
}

调用示例:

新建对应发布类以及线程,将发布类移入线程:

    QThread *m_PubThread;QThread *m_SubThread;ZmqPublisher *m_Publisher;ZmqSubscriber *m_Subscriber;

使用线程调用:

    m_PubThread = new QThread;m_SubThread = new QThread;m_Publisher = new ZmqPublisher;m_Subscriber = new ZmqSubscriber;m_Publisher->moveToThread(m_PubThread);m_Subscriber->moveToThread(m_SubThread);connect(this, &MainWindow::publishData, m_Publisher,&ZmqPublisher::publishData);connect(m_Subscriber, &ZmqSubscriber::dataReceived,[=](const QByteArray &data) {//TODO 处理zmq接收数据});m_PubThread->start();m_SubThread->start();QMetaObject::invokeMethod(m_Subscriber, &ZmqSubscriber::procesMessage);

运行效果:

相关文章:

Qt网络编程-ZMQ的使用

不同主机或者相同主机中不同进程之间可以借助网络通信相互进行数据交互&#xff0c;网络通信实现了进程之间的通信。比如两个进程之间需要借助UDP进行单播通信&#xff0c;则双方需要知道对方的IP和端口&#xff0c;假设两者不在同一主机中&#xff0c;如下示意图&#xff1a; …...

如何清理Docker占用的磁盘空间?

在Docker中&#xff0c;随着时间的推移&#xff0c;占用的磁盘空间可能会不断增加。为了保持系统的稳定性和性能&#xff0c;定期清理Docker占用的磁盘空间非常重要。下面将介绍一些清理Docker磁盘空间的方法。 一、清理无用的容器 有时候&#xff0c;我们可能会运行一些临时…...

从零开始学HCIA之NAT基本工作原理

1、NAT设计之初的目的是解决IP地址不足的问题&#xff0c;慢慢地其作用发展到隐藏内部地址、实现服务器负载均衡、完成端口地址转换等功能。 2、NAT完成将IP报文报头中的IP地址转换为另一个IP地址的过程&#xff0c;主要用于实现内部网络访问外部网络的功能。 3、NAT功能一般…...

Day40- 动态规划part08

一、单词拆分 题目一&#xff1a;139. 单词拆分 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以…...

论文笔记:相似感知的多模态假新闻检测

整理了RecSys2020 Progressive Layered Extraction : A Novel Multi-Task Learning Model for Personalized Recommendations&#xff09;论文的阅读笔记 背景模型实验 论文地址&#xff1a;SAFE 背景 在此之前&#xff0c;对利用新闻文章中文本信息和视觉信息之间的关系(相似…...

5G技术对物联网的影响

随着数字化转型的加速&#xff0c;5G技术作为通信领域的一次重大革新&#xff0c;正在对物联网&#xff08;IoT&#xff09;产生深远的影响。对于刚入行的朋友们来说&#xff0c;理解5G技术及其对物联网应用的意义&#xff0c;是把握行业发展趋势的关键。 让我们简单了解什么是…...

Nacos1.X源码解读(待完善)

目录 下载源码 注册服务 客户端注册流程 注册接口API 服务端处理注册请求 设计亮点 服务端流程图 下载源码 1. 克隆git地址到本地 # 下载nacos源码 git clone https://github.com/alibaba/nacos.git 2. 切换分支到1.4.7, maven编译(3.5.1) 3. 找到启动类com.alibaba.na…...

算法之双指针系列1

目录 一&#xff1a;双指针的介绍 1&#xff1a;快慢指针 2&#xff1a;对撞指针 二&#xff1a;对撞指针例题讲述 一&#xff1a;双指针的介绍 在做题中常用两种指针&#xff0c;分别为对撞指针与快慢指针。 1&#xff1a;快慢指针 简称为龟兔赛跑算法&#xff0c;它的基…...

苍穹外卖面试题

8. 如何理解分组校验 很多情况下&#xff0c;我们会将校验规则写到实体类中的属性上&#xff0c;而这个实体类有可能作为不同功能方法的参数使用&#xff0c;而不同的功能对象参数对象中属性的要求是不一样的。比如我们在新增和修改一个用户对象时&#xff0c;都会接收User对象…...

【Qt 学习之路】在 Qt 使用 ZeroMQ

文章目录 1、概述2、ZeroMQ介绍2.1、ZeroMQ 是什么2.2、ZeroMQ 主线程与I/O线程2.3、ZeroMQ 4种模型2.4、ZeroMQ 相关地址 3、Qt 使用 ZeroMQ3.1、下载 ZeroMQ3.2、添加 ZeroMQ 库3.3、使用 ZeroMQ3.4、相关 ZeroMQ 案例 1、概述 今天是大年初一&#xff0c;先给大家拜个年&am…...

CI/CD到底是啥?持续集成/持续部署概念解释

前言 大家好&#xff0c;我是chowley&#xff0c;日常工作中&#xff0c;我每天都在接触CI/CD&#xff0c;今天就给出我心中的答案。 在现代软件开发中&#xff0c;持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续部署&#xff08;Continuous D…...

golang常用库之-disintegration/imaging图片操作(生成缩略图)

文章目录 golang常用库之什么是imaging库导入和使用生成缩略图 golang常用库之 什么是imaging库 官网&#xff1a;https://github.com/disintegration/imaging imaging 是一个 Go 语言的图像处理库&#xff0c;它提供了一组功能丰富的函数和方法&#xff0c;用于进行各种图像…...

CSS 控制 video 标签的控制栏组件的显隐

隐藏下载功能 <video src"" controlsList"nodownload" />controlslist 取值如下(设定多个值则使用空格进行间隔) 如&#xff1a;controlslist"nodownload nofullscreen noremoteplayback"nodownload&#xff1a;取消更多控件弹窗的下载功…...

数据可视化之维恩图 Venn diagram

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图或韦恩图&#xff0c;是一种关系型图表&#xff0c;用于显示元素集合之间的重叠区…...

2024刘谦春晚第二个扑克牌魔术

前言 就是刚才看春晚感觉这个很神奇&#xff0c;虽然第一个咱模仿不过来&#xff0c;第二个全国人民这么多人&#xff0c;包括全场观众都有成功&#xff0c;这肯定是不需要什么技术&#xff0c;那我觉得这个肯定就是数学了&#xff0c;于是我就胡乱分析一通。 正文 首先准备…...

【k8s系列】(202402) 证书apiserver_client_certificate_expiration_seconds

apiserver_client_certificate_expiration_second证书定义的位置&#xff1a;kubernetes/staging/src/k8s.io/apiserver/pkg/authentication/request/x509/x509.go at 244fbf94fd736e94071a77a8b7c91d81163249d4 kubernetes/kubernetes (github.com) apiserver_client_certi…...

Rust变量与常量介绍

Rust是一门注重安全性和性能的系统编程语言&#xff0c;其中变量和常量的概念有着独特的设计和特性。在本文中&#xff0c;我们将深入了解Rust中的变量和常量&#xff0c;并解释它们之间的区别&#xff0c;同时通过多个例子进行说明。 Rust常量 在Rust中&#xff0c;常量是不…...

Flask基础学习2

连接mysql数据库测试(专业版) [注意1&#xff1a;要导入text库&#xff0c;否则可能出现找不到select 1错误] [注意2&#xff1a;若出现下列问题&#xff0c;可按照模板代码的顺序db SQLAlchemy(app) 的位置] RuntimeError: Either SQLALCHEMY_DATABASE_URI or SQLALCHEMY_B…...

文章页的上下篇功能是否有必要?boke112百科取消上下篇功能

也不知道是从什么时候开始&#xff0c;我们很多站长的博客网站文章页都会在文末添加上“上一篇”和“下一篇”功能&#xff0c;目的是进行站内SEO优化和方便用户阅读上下篇文章。 boke112百科不管是以前使用的Three主题还是现在使用的YIA主题&#xff0c;刚开始的文章页都是有…...

Lua序列化

我们经常需要序列化一些数据&#xff0c;为了将数据转换为字节流或者字符流&#xff0c;这样我们就可以保存到文件或者通过网络发送出去。我们可以在 Lua 代码中描述序列化的数据&#xff0c;在这种方式下&#xff0c;我们运行读取程序即可从代码中构造出保存的值。 number/st…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...