南和邢台网站制作/千锋教育官网

南和邢台网站制作,千锋教育官网,罗湖建设网站,俄罗斯乌克兰开战之前写过一篇Qt使用ZMQ的博客Qt网络编程-ZMQ的使用,本文是其的补充部分。 Linux上编译使用 首先这次实在Linux上进行演示,下载zmq源码,安装cmake,使用cmake进行编译。下载之后解压: 输入命令: cd ..mkdi…

之前写过一篇Qt使用ZMQ的博客Qt网络编程-ZMQ的使用,本文是其的补充部分。

Linux上编译使用

首先这次实在Linux上进行演示,下载zmq源码,安装cmake,使用cmake进行编译。下载之后解压:

输入命令:

cd ..mkdir zmqbuildcmake ../libzmq-master

会有以下输出:

输入:

make -j16

等待编译完成:

在该目录下即可找到对应的动态库文件:

新建工程,然后将头文件和动态库文件放进来,然后在工程文件中引入头文件和库文件。

这是我的文件结构:

工程文件:


#引入libzmq头文件和库
INCLUDEPATH += $PWD/zmq/includeunix {LIBS += -L$$PWD/zmq/libLIBS += -lzmq
}

基于TCP通信 

在之前的博客中发布和订阅段有对应的bind和connect方法进行绑定和连接:

bool ZmqPublisher::bind(quint16 port) {QString arg = QString("tcp://*:%1").arg(port);int rc = zmq_bind(socket, arg.toUtf8().constData());return rc == 0;
}bool ZmqSubscriber::connectTo(quint16 port) {QString arg = QString("tcp://localhost:%1").arg(port);int rc = zmq_connect(socket, arg.toUtf8().constData());return rc == 0;
}

这两个方法内部使用tcp进行网络通信。bind和connect也可以绑定具体的ip和端口,以下是扩充方法:

bool ZmqPublisher::bind(const QString &ip, quint16 port)
{QString arg = QString("tcp://%1:%2").arg(ip).arg(port);int rc = zmq_bind(socket, arg.toUtf8().constData());return rc == 0;
}bool ZmqSubscriber::connectTo(const QString &ip, quint16 port)
{QString arg = QString("tcp://%1:%2").arg(ip).arg(port);int rc = zmq_connect(socket, arg.toUtf8().constData());return rc == 0;
}

写一个测试程序进行测试:

可以看到发布端bind后对应的tcp开始listen了。

然后订阅段进行connect:

对应的tcp连接已经建立。

测试通信:

通信正常。

基于本地文件通信

zmq除了借助TCP网络进行进程间通信还可以使用 文件进行进程间通信,这里封装对应的方法:

bool ZmqPublisher::bind(const QString &path)
{int rc = zmq_bind(socket, path.toUtf8().constData());return rc == 0;
}bool ZmqSubscriber::connectTo(const QString &path)
{int rc = zmq_connect(socket, path.toUtf8().constData());return rc == 0;
}

直接传入对应的地址,当然这里path传“tcp://{ip}:{port}”这种也行,这样就是前面提到的网络通信了。本地文件通信传入格式是“ipc://{path}”。

可以看到生成了一个文件:

使用命令查看文件属性:

这就是进行通信的socket文件。订阅端进行connect:

使用命令查看连接情况,之前在TCP和UDP通信的博客中讲到了使用netstat查看网络连接,实际上netstat也可以查看这种本地文件连接:

 使用ss命令也可以查看,ss命令功能比netstat命令广泛,后续推荐使用ss命令。

通信测试:

注意事项:

1.注意对应文件的路径,因为我的示例中socket文件在执行文件同级目录下所以使用的是相对路径。(bind和connect时传入完整路径:比如bind("/home/pc/zkh/projects/build-zmqproject-Desktop_Qt_5_12_12_GCC_64bit-Debug/test"))

2.直接使用本地文件bind(ipc://{path})这种方式通信目前不能跨主机而且在windows上无效 。

 代码优化

之前写的代码调用比较麻烦,其中要在调用处新建线程类,然后订阅部分每connect一个都要新建sub对象,所以我在pub和sub类之上在新建一个类ZmqPubSub,对二者进行管理,调用者只需要新建ZmqPubSub这一个类就可以进行发布订阅消息处理相关操作,而且方便处理多个订阅端,以下是代码:

头文件:

#ifndef ZMQPUBSUB_H
#define ZMQPUBSUB_H#include <QObject>class QThread;
class ZmqSubscriber;
class ZmqPublisher;
class ZmqPubSub : public QObject
{Q_OBJECT
public:explicit ZmqPubSub(QObject *parent = nullptr);void init(const QString &pubPath,const QStringList &subPaths);signals:void dataReceived(const QByteArray &data);public slots:void publishData(const QByteArray &data);private:bool m_Inited;ZmqPublisher *m_Pub;QList<ZmqSubscriber *>m_Subs;QList<QThread *>m_Ths;};#endif // ZMQPUBSUB_H

源文件:

#include "zmqpubsub.h"
#include "zmqpublisher.h"
#include "zmqsubscriber.h"
#include <QThread>
#include <QDataStream>ZmqPubSub::ZmqPubSub(QObject *parent) : QObject(parent),m_Inited(false),m_Pub(nullptr)
{}void ZmqPubSub::init(const QString &pubPath, const QStringList &subPaths)
{if(m_Inited)return;QThread *pubTh=new QThread;m_Pub=new ZmqPublisher;m_Pub->bind(pubPath);m_Pub->moveToThread(pubTh);pubTh->start();m_Ths.append(pubTh);for(const QString &subPath:subPaths){QThread *subTh=new QThread;ZmqSubscriber *sub=new ZmqSubscriber;sub->connectTo(subPath);sub->moveToThread(subTh);subTh->start();m_Subs.append(sub);m_Ths.append(subTh);connect(sub, &ZmqSubscriber::dataReceived,this,&ZmqPubSub::dataReceived);QMetaObject::invokeMethod(sub, &ZmqSubscriber::procesMessage);}m_Inited=true;
}void ZmqPubSub::publishData(const QByteArray &data)
{if(m_Inited){m_Pub->publishData(data);}
}

调用的时候只需要新建ZmqPubSub类即可,线程相关在内部自行处理 ,init方法初始化可以处理多个订阅端的问题。一个类实现发布订阅功能。

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

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

相关文章

记录致远OA服务器硬盘升级过程

前言 日常使用中OA系统突然卡死&#xff0c;刷新访问进不去系统&#xff0c;ping服务器地址正常&#xff0c;立马登录服务器检查&#xff0c;一看磁盘爆了。 我大脑直接萎缩了&#xff0c;谁家OA系统配400G的空间啊&#xff0c;过我手的服务器没有50也是30台&#xff0c;还是…

[测试]自动化的概念 及使用Selenium实现Web自动化测试

文章目录 1. 自动化1.1 自动化概念1.2 自动化分类1.2.1 接口自动化1.2.2 UI自动化 1.3 自动化测试金字塔 2. Web自动化测试2.1 驱动 3. Selenium3.1 一个简单的Web自动化示例3.2 Selenium 驱动 浏览器的工作原理 1. 自动化 1.1 自动化概念 自动化是指自动地代替人的行为完成…

Python教程(三):类对象、闭包、装饰器、类型注解、MRO

Python总结&#xff08;三&#xff09; 本系列其他教程&#xff1a; Python教程(一)&#xff1a;基本语法、流程控制、数据容器 Python教程(二)&#xff1a;函数、异常、模块&包、文件读取、常用模块 文章目录 Python总结&#xff08;三&#xff09;一、类&对象1.1 成…

什么是 HTML?

HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup LanguageHTML 不是一种编程语言&#xff0c;而是一种标记语言标记语言是一套标记标签 (markup tag)HTML 使用标记标签来描述网页HTML 文档包含了HTML 标签及文本内容HTML文档也叫做 web 页面 HT…

如何用AI制作PPT,轻松实现高效演示

如何用AI制作PPT&#xff0c;轻松实现高效演示&#xff01;在今天这个快节奏的时代&#xff0c;我们的工作方式越来越依赖智能工具。而当涉及到演示文稿时&#xff0c;传统的PPT制作方式往往繁琐且耗时。很多人一提到制作PPT就头大&#xff0c;特别是在内容需要多次修改、调整布…

Canoe Panel基础功能介绍

文章目录 一、新建 Panel 面板二、添加 Panel 面板三、删除 Panel 面板四、Panel视图&#xff08;views&#xff09;五、控件布局1. 对齐布局2. 控件大小布局 六、Panel 属性设置1. 设置背景色和背景图片2. 调整 Panel 画布大小 提示&#xff1a;如何使用 Panel 面板参考 CANoe…

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…

2.2 企业级ESLint/Prettier规则定制

文章目录 1. 为什么需要企业级代码规范2. 工具选型对比3. 完整配置流程3.1 项目初始化3.2 ESLint深度配置3.3 Prettier精细配置3.4 解决规则冲突4. 高级定制方案4.1 自定义ESLint规则4.2 扩展Prettier插件5. 团队协作策略5.1 配置共享方案5.2 版本控制策略6. CI/CD集成7. 常见问…

oracle11.2.0.4 RAC 保姆级静默安装(二) DB数据库软件

1.响应文件配置 [rootdb11g1 software]# su - oracle [oracledb11g1 ~]$ cd /software/database/ [oracledb11g1 database]$ cd response/ [oracledb11g1 response]$ vi db_install.rsp oracle.install.optionINSTALL_DB_SWONLY ORACLE_HOSTNAMEdb11g1 UNIX_GROUP_NAME…

EasyCVR安防视频汇聚平台助力工业园区构建“感、存、知、用”一体化智能监管体系

在现代工业园区的安全管理和高效运营中&#xff0c;视频监控系统扮演着不可或缺的角色。然而&#xff0c;随着园区规模的扩大和业务的复杂化&#xff0c;传统的视频监控系统面临着诸多挑战&#xff0c;如设备众多难以统一管理、数据存储分散、智能分析能力不足、信息利用率低下…

反射、反射调用以及修改成员变量,成员方法,构造函数、反射的应用

DAY11.2 Java核心基础 反射&#xff08;第二弹&#xff09; 第一弹请访问链接&#xff1a; 反射&#xff08;第一篇&#xff09; getMethod(String name, Class… parameterTypes)getMethods()getDeclaredMethod(String name,Class… parameterTypes)getDeclaredMethods() …

【鸿蒙开发】Hi3861学习笔记- 外部中断

00. 目录 文章目录 00. 目录01. 概述02. EXTI相关API03. 硬件设计04. 软件设计05. 实验现象06. 附录 01. 概述 我们在做按键控制实验时&#xff0c;虽然能实现 IO 口输入功能&#xff0c;但代码是一直在检测 IO 输入口的变化&#xff0c;因此效率不高&#xff0c;特别是在一些…

Visual studio + Qt 项目配置管理

Visual studio Qt 项目配置管理 1.本机顺利安装 vs 和 Qt 软件 ​ 并且设置好Qt 的环境变量比如 E:\Qt\Qt5.9.8\5.9.8\msvc2017_64\bin E:\Qt\Qt5.9.8\5.9.8\msvc2017_64\lib E:\Qt\Qt5.9.8\5.9.8\msvc2017_64\include //这里是你电脑上Qt的路径&#xff0c;每台电脑不一样…

SpringCloud带你走进微服务的世界

认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个…

FastAPI复杂查询终极指南:告别if-else的现代化过滤架构

title: FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt: 本文系统讲解FastAPI中复杂查询条件的构建方法,涵盖参数验证、动态过滤、安全防护等18个核心技术点。通过引入策略模式、声明式编程等技术,彻…

Ubuntu 22.04使用pigz多线程快速解压/压缩文件

最近搞项目&#xff0c;资料太大&#xff0c;解压时间太久&#xff0c;于是想办法解决。 开贴记录。 1.安装pigz sudo apt install pigz 2.解压资料 解压命令为 tar --use-compress-programpigz -xvpf ***.tar.gz 将最后的部分***.tar.gz换成你自己的文件即可 例如 ti…

日本IT|AWS工作内容及未来性、以及转职的所需资质和技能

AWSとは AWSはAmazon Web Services&#xff08;アマゾンウェブサービス&#xff09;の略称です。 名称から分かるとおり、ネットを通じた通販などを事業として行っているAmazon.com社がクラウドサービスとして運営しています。 本来であれば自分たちでインフラ環境を構築する…

Conda+jupyterlab

文章目录 1、Conda1.1、基本介绍1.2、conda安装1.3、conda常用命令1.3.1、基本命令1.3.2、环境管理 2、Jupyterlab2.1、基本介绍2.2、安装使用 3、pycharm中使用conda 1、Conda 1.1、基本介绍 Conda 是一个开源的包管理和环境管理工具&#xff0c;适用于 Python 及其他编程语…

从零基础到能独立设计单片机产品,一般需要经历哪些学习阶段?

相信很多人&#xff0c;内心都有“钢铁侠”的幻想&#xff0c;成为能写程序&#xff0c;能设计硬件&#xff0c;能设计结构&#xff0c;能焊接的全能型人才。 上次徐工问我&#xff0c;如果你财富自由了&#xff0c;想去做啥&#xff1f; 我说出来&#xff0c;可能大家都不信&a…

使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)

说明&#xff1a; 本案例采用的定时器3&#xff08;TIM3&#xff09;实现&#xff0c;使用其他定时器是一样配置。 如何新建一个工程以及如何配置LED的端口&#xff0c;请查看前面文章&#xff1a;使用STM32CubeMX实现LED灯每秒闪烁一次&#xff08;STM32G070CBT6单片机&…