Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端

  • 1 开发 WebSocket 客户端
    • 1.1 开发环境
      • 1.1.1 为Qt 6安装 websockets
    • 1.2 .基于Qt6的 QWebSocket 客户端示例
      • 1.2.1 实现 WebSocket 客户端
      • 1.2.2 创建 QtQWesocketClient
      • 1.2.3 创建QWebsocket对象
        • 1.2.3.1 添加 QtClientWebsocketBase 基类
        • 1.2.3.2 改造 QtClientWebsocketBase 基类
        • 1.2.3.3 创建 QWebSocket 对象,连接其相关的信号和槽
        • 1.2.3.4 在链接器中增加 QWebSocket(Qt6WebSockets.lib)和Qt网络模块(Qt6Network.lib)
  • 2 多线程 websocket
    • 2.1 从QtClientWebsocketBase派生一个类 QtClientWorker
    • 2.2 moveToThread QtClientWorker 对象

1 开发 WebSocket 客户端

今天我们来开发一个结程池异步的WebSocket客户端,WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,相信大家都有一些了解,我就不多介绍了。

1.1 开发环境

Windows 11 + Visual Studio 2022 + Qt6,Websocket采用的是 Qt6提供的QWebSocket(Qt6WebSockets.lib),他是Qt网络模块(Qt6Network.lib)的一部分,提供了对WebSocket协议的支持。

1.1.1 为Qt 6安装 websockets

如在安装QT时没有安装 websockets 库,后面会找不到需要的头文件,这里我以Windows 11版本来说明为 Qt6 安装 websockets。在控制面板中,选中程序和功能,在卸载或更改程序中选中“QT”,在维护Qt里选择 添加或移除组件。

在这里插入图片描述
在对应的QT版本的目录下找到Qt WebSockets进行安装。
在这里插入图片描述

1.2 .基于Qt6的 QWebSocket 客户端示例

1.2.1 实现 WebSocket 客户端

我们来看客户端实现的步骤。

步骤说明
建立连接WebSocket 客户端首先通过 WebSocket URL(ws:// 或 wss://)来连接到服务器,与服务端建立连接。
发送和接收数据连接建立成功后,客 WebSocket户端通过发送和接收消息来和服务端交换数据。
处理事件WebSocket 客户端可以监听连接状态、错误和消息等事件,并根据需要处理这些事件。
关闭连接在交换数据任务完成后, WebSocket 客户端应该友好关闭 WebSocket 连接,释放资源。

1.2.2 创建 QtQWesocketClient

在Qt6中创建一个 Qt Widgets Application 新项目 QtQWesocketClient 来开发QWebSocket 客户端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2.3 创建QWebsocket对象

1.2.3.1 添加 QtClientWebsocketBase 基类

我们在 QtQWesocketClient 项目中添加一个 QtClientWebsocketBase 基类,用来创建QWebSocket,并连接其相关的信号和槽。
在这里插入图片描述

1.2.3.2 改造 QtClientWebsocketBase 基类

Visual Studio 2022 和 Qt6的环境还不是太完善,生成的类和我们需要的有挺大差异,我们来改造下,代码如下:

// QtClientWebsocketBase.h
#include <qobject>class QtClientWebsocketBase : public QObject
{Q_OBJECTpublic:explicit QtClientWebsocketBase(QObject* parent);~QtClientWebsocketBase();
};
// QtClientWebsocketBase.cpp
#include "QtClientWebsocketBase.h"QtClientWebsocketBase::QtClientWebsocketBase(QObject* parent) : QObject(parent)
{
}QtClientWebsocketBase::~QtClientWebsocketBase()
{
}
1.2.3.3 创建 QWebSocket 对象,连接其相关的信号和槽
  • 当连接成功时,connected() 信号会被触发,我们通过 connect(m_pWebSocket, SIGNAL(connected()), this, SLOT(slotConnected())); 将信号 connected 和槽函数 slotConnected 连接起来;
  • 当连接断开时,disconnected() 信号会被触发,我们通过 connect(m_pWebSocket, SIGNAL(disconnected()), this, SLOT(slotDisconnected())); 将信号 disconnected 和槽函数 slotDisconnected 连接起来;
  • 当连接出错时,error() 信号会被触发,我们通过 connect(m_pWebSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slotError(QAbstractSocket::SocketError))); 将信号 error() 和槽函数 slotError连接起来;
  • 当接收到服务端文本消息时,textMessageReceived() 信号会被触发,我们通过 connect(m_pWebSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(slotRecvTextMsg(QString))); 将 textMessageReceived() 信号 和槽函数slotRecvTextMsg 连接起来;
  • 当接收到服务端二进制消息时,binaryMessageReceived() 信号会被触发,我们通过 connect(m_pWebSocket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(slotRecvBinaryMsg(QByteArray)));将 binaryMessageReceived() 信号 和槽函数 slotRecvBinaryMsg 连接起来。
#pragma once#include <QObject>
#include <QDebug>
#include <QUrl>
#include <QSettings>
#include <QtNetwork/qabstractsocket.h>
#include <QtWebSockets/qwebsocket.h>class QClientWebSocketBase : public QObject
{Q_OBJECTpublic:explicit QClientWebSocketBase(QObject* parent);~QClientWebSocketBase();private:void setSslConfiguation();                  // 设置wss连接的SSL配置public:void connectUrl(QString ip, qint32 port, bool enableSsl); // 连接websocket服务器的URLvoid close();                               // 关闭websocketvoid sendTextMsg(const QString& message);   // 发送Text类型的消息void sendBinaryMsg(const QByteArray& data); // 发送Binary类型的消息bool getConnectStatus(

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

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

相关文章

iOS object-C 解答算法:找到所有数组中消失的数字(leetCode-448)

找到所有数组中消失的数字(leetCode-448) 题目如下图:(也可以到leetCode上看完整题目,题号448) 光看题看可能有点难以理解,我们结合示例1来理解一下这道题. 有8个整数的数组 nums [4,3,2,7,8,2,3,1], 求在闭区间[1,8]范围内(即1,2,3,4,5,6,7,8)的数字,哪几个没有出现在数组 …

新装centos7虚拟机如何配置网络,NAT配置固定IP

首先声明&#xff0c;我想使用的是NAT连接模式&#xff0c;并且设置完IP之后&#xff0c;使得这个IP固定住&#xff0c;以后不会再变了。 文章目录 1&#xff0c;打开Vmware软件的【编辑】-【虚拟网络编辑器】2&#xff0c;先选择VMnet8&#xff08;画1处&#xff09;&#xf…

解析capl文件生成XML Test Module对应的xml工具

之前一直用的CAPL Test Module来写代码&#xff0c;所有的控制都是在MainTest()函数来实现的&#xff0c;但是有一次&#xff0c;代码都写完了&#xff0c;突然需要用xml的这种方式来实现&#xff0c;很突然&#xff0c;之前也没研究过&#xff0c;整理这个xml整的一身汗&#…

Hive3:库操作常用语句

1、创建库 create database if not exists myhive;2、选择库 use myhive;3、查看当前选择的库 SELECT current_database();4、查看库详细信息 desc database myhive;可以查看数据文件在hdfs集群中的存储位置 5、创建库时制定hdfs的存储位置 create database myhive2 …

安全防护软件的必要性:从微软蓝屏事件谈起

最近微软遭遇了的大规模蓝屏事件&#xff0c;让全球很多用户措手不及。这次事件告诉我们&#xff0c;保护我们的电脑和数据&#xff0c;安全防护软件是多么重要。 微软蓝屏事件源于网络安全公司CrowdStrike的技术更新错误&#xff0c;导致全球范围内大量Windows用户系统崩溃&a…

什么是五力分析?5分钟带你了解它在企业财务经营中的应用与价值!

如今&#xff0c;随着全球化进程的不断加速&#xff0c;市场环境复杂多变&#xff0c;市场竞争日益激烈&#xff0c;财务经营已经成为了企业应对复杂市场环境、保持自身竞争力的关键。体系化的五力分析平台能够为企业提供一套全面的解决方案&#xff0c;帮助企业在盈利能力、偿…

HamonyOS性能优化工具和方法

性能优化&#xff0c;如何做到更快的启动、更流畅的使用&#xff0c;概括图如下 ArkTS高性能编程&#xff1a; 1. ArkTS规则&#xff1a;有利于方舟编译运行时进行编译优化 2. 使用AOT(Ahead Of Time)模式对应用进行编译优化&#xff1a;方舟编译运行时通过采用PGO(Profile-Gui…

React 学习——组件内通信(兄弟之间)

A组件 > B组件 核心思路&#xff1a; 1、A组件先通过子传父的方式把数据传给父组件App 2、App拿到数据后通过父传子的方式再传递给B组件 import { useState } from "react" function A({onGetMsg}){const AMsg 我是A组件的消息return (<div><button…

ESP-ADF适配到自定义开发板中

ESP-ADF适配到自定义开发板中 前言:项目开发完了,来记录一下开发过程。 安装: 这里采用vscode+ESP-IDF+ESP-ADF的开发方式。 安装esp-idf的方法很简单,网上都是,这里不说了。想用esp-adf那么你idf的环境肯定是已经搭建好了。 安装adf也很简单,一步完成。 按下F1,选…

鸿蒙对接极光推送时候报错1000900010,厂商token获取失败

在AppGallery Connect上配置项目的调试证书&#xff0c;然后手动导入&#xff0c;不要用IDE的自动构建证书&#xff1a; https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/

web前端开发一、VScode环境搭建

1、VScode安装live server插件&#xff0c;写完代码后&#xff0c;保存就会在浏览器自动更新&#xff0c;不需要再去浏览器点击刷新了 2、创建html文件 3、在文件中输入感叹号 &#xff01; 4、选择第一个&#xff0c;然后回车&#xff0c;就会自动输入html的标准程序 5、…

js_拳皇(下)

文章目录 架构设计视频演示碰撞检测碰撞检测函数 构想血条和计时器全屏后续工作 架构设计 一图胜千言 #mermaid-svg-erOUDyAO5t0XgYyU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-erOUDyAO5t0XgYyU .error-icon{…

微信聊天记录丢失怎么办?3款数据恢复大师免费版,你选对了吗?

在这个网络时代&#xff0c;微信可不只是用来聊天的&#xff0c;它还帮我们处理工作、记录生活、保存美好回忆。但是&#xff0c;如果微信里的东西突然没了&#xff0c;那感觉就像是回到了没有网络的黑暗时期&#xff0c;让人焦虑又无助。别怕&#xff0c;今天咱们就来说说大家…

整箱排柜不返工?用易境通散拼系统就OK

想必困扰散货拼柜小伙伴们一大难题就是&#xff0c;怎么把错乱纷繁的货物有序地整箱排柜&#xff0c;并且要保证集装箱高效利用&#xff0c;运输成本尽量降低。这不仅要求操作者具备卓越的统筹规划能力&#xff0c;更需长期积累的实践经验和敏锐的应变能力。易境通散拼系统可以…

HarmonyOS NEXT星河版零基础入门到实战

文章目录 一、HarmonyOS NEXT介绍学习内容1、鸿蒙APP开发2、能力套件开发3、全场景开发适合人群 持续更新中✒️总结 一、HarmonyOS NEXT介绍 放弃安卓框架之后&#xff0c;HarmonyOS NEXT成为真正独立于安卓、iOS的操作系统&#xff0c;堪称是一场史无前例的脱胎换骨。在其众多…

NC 缺失的第一个正整数

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个无重…

Python | Leetcode Python题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLIS(self, nums: List[int]) -> int:d []for n in nums:if not d or n > d[-1]:d.append(n)else:l, r 0, len(d) - 1loc rwhile l < r:mid (l r) // 2if d[mid] > n:loc midr mid - 1else:l…

6 Java的基本程序设计结构(基本语法5)- 面向对象进阶

文章目录 面向对象进阶一、 static 静态1 静态变量(1)基本定义和用法(2)静态变量内存图2 静态方法(1)基本定义和用法(2)工具类练习:按下面需求写一个工具类3 static注意事项4 重新认识main方法二、继承1 继承的概念2 继承的特点3 继承到底能继承父类中的哪些内容?4 继…

阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接

参考教程&#xff1a; 官网教程 参考教程一 首先彻底删除mysql5.7 dpkg --list|grep mysql #查看 sudo apt-get remove mysql-common #卸载 sudo apt-get autoremove --purge mysql-server-5.7 #版本自己修改 dpkg -l|grep ^rc|awk {print$2}|sudo xargs dpkg -P #清除残留数…

【释放品牌魅力,开启营销新篇章】—— 短视频矩阵营销系统源码

【释放品牌魅力&#xff0c;开启营销新篇章】—— 短视频矩阵营销系统在这个数字化高速发展的时代&#xff0c;您是否还在为品牌曝光度不足、营销效果不佳而苦恼&#xff1f;来吧&#xff0c;让我们一起探索全新的解决方案——短视频矩阵营销系统&#xff01; 在这个数字化高速…