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

文章目录

  • 1、概述
  • 2、ZeroMQ介绍
    • [2.1、ZeroMQ 是什么](#2.1、ZeroMQ 是什么)
    • [2.2、ZeroMQ 主线程与I/O线程](#2.2、ZeroMQ 主线程与I/O线程)
    • [2.3、ZeroMQ 4种模型](#2.3、ZeroMQ 4种模型)
    • [2.4、ZeroMQ 相关地址](#2.4、ZeroMQ 相关地址)
  • [3、Qt 使用 ZeroMQ](#3、Qt 使用 ZeroMQ)
    • [3.1、下载 ZeroMQ](#3.1、下载 ZeroMQ)
    • [3.2、添加 ZeroMQ 库](#3.2、添加 ZeroMQ 库)
    • [3.3、使用 ZeroMQ](#3.3、使用 ZeroMQ)
    • [3.4、相关 ZeroMQ 案例](#3.4、相关 ZeroMQ 案例)

1、概述

今天是大年初一,先给大家拜个年,祝各位阖家欢乐,身体安康,万事如意。

言归正传,最近调研了很多消息中间件,推荐一款比较好用的中间件 ZeroMQ,今天也把在 Qt 上如何使用 ZeroMQ 分享下。

2、ZeroMQ介绍

2.1、ZeroMQ 是什么

ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。

ZMQ不是单独的服务,而是一个嵌入式库,它封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。

2.2、ZeroMQ 主线程与I/O线程

I/O线程,ZMQ根据用户调用zmq_init函数时传入的参数,创建对应数量的I/O线程。每个I/O线程都有与之绑定的Poller,Poller采用经典的Reactor模式实现。

Poller根据不同操作系统平台使用不同的网络I/O模型(select、poll、epoll、devpoll、kequeue等),所有的I/O操作都是异步的,线程不会被阻塞。

主线程与I/O线程通过Mail Box传递消息来进行通信。

Server,在主线程创建zmq_listener,通过Mail Box发消息的形式将其绑定到I/O线程,I/O线程把zmq_listener添加到Poller中用以侦听读事件。

Client,在主线程中创建zmq_connecter,通过Mail Box发消息的形式将其绑定到I/O线程,I/O线程把zmq_connecter添加到Poller中用以侦听写事件。

Client与Server第一次通信时,会创建zmq_init来发送identity,用以进行认证。认证结束后,双方会为此次连接创建Session,以后双方就通过Session进行通信。

每个Session都会关联到相应的读/写管道, 主线程收发消息只是分别从管道中读/写数据。Session并不实际跟kernel交换I/O数据,而是通过plugin到Session中的Engine来与kernel交换I/O数据。

2.3、ZeroMQ 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提供进程内(inproc://)、进程间(ipc://)、机器间(tcp://)、广播(pgm://)等四种通信协议。

2.4、ZeroMQ 相关地址

官网地址:http://zeromq.org/

Github地址:https://github.com/zeromq/libzmq/releases

Gitcode地址:https://gitcode.com/zeromq/libzmq/overview?utm_source=csdn_github_accelerator&isLogin=1

Github示例:使用Qt通过zmq的C++接口封装

下载地址:https://github.com/zeromq/libzmq/releases

3、Qt 使用 ZeroMQ

在 Qt 里面使用 ZeroMQ,主要关注是在什么环境下使用。因为 Qt 是跨平台的,我们可能使用 ZeroMQ 和 Qt 在不同的开发环境中,本文以 Windows 环境为例。

3.1、下载 ZeroMQ

打开https://github.com/zeromq/libzmq/releases

当前最新的是 4.3.5 版本。我下载的是"zeromq-4.3.5.zip",可以看到最新更新是2023年10月9号的

3.2、添加 ZeroMQ 库

在文件夹中有两个.lib 一个.dll和一个 .h,将这几个文件复制到QT项目工程下(.lib只需要一个就够 了)。将QT下的.lib文件改名,libzmq...lib改成lzmq...lib。

在.pro中添加以下内容:

bash 复制代码
HEADERS += zmq.h
LIBS += "lzmq...lib"

3.3、使用 ZeroMQ

测试代码:成功就会输出zmq的版本号

cpp 复制代码
#include <QApplication>
#include <QDebug>
#include "zmq.h"
int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	MainWindow w;
	//w.show();
	int x, y, z;
	zmq_version(&x, &y, &z);
	qDebug() << "zmq-version:" <<x << "-" << y << "-" << z;
	return a.exec();
}

3.4、相关 ZeroMQ 案例

关于带有ZeroMQ的c ++:Qt发布订阅模式:https://www.codenong.com/31443017/

相关推荐
锦亦之22332 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
柳鲲鹏5 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶5 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
阳光开朗_大男孩儿11 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople12 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码12 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码15 小时前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt16 小时前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher951117 小时前
qt相关面试题
开发语言·qt·面试
三玖诶1 天前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式