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

news2024/9/9 1:09:18

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_OBJECT

public:
    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_OBJECT

public:
    explicit QClientWebSocketBase(QObject* parent);
    ~QClientWebSocketBase();

private:
    void setSslConfiguation();                  // 设置wss连接的SSL配置

public:
    void connectUrl(QString ip, qint32 port, bool enableSsl); // 连接websocket服务器的URL
    void close();                               // 关闭websocket
    void sendTextMsg(const QString& message);   // 发送Text类型的消息
    void sendBinaryMsg(const QByteArray& data); // 发送Binary类型的消息
    bool getConnectStatus(

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

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

相关文章

轻松实现人声与伴奏分离,轻松获取纯净音质

SpleeterGui是一款用于人声与伴奏分离的开源软件&#xff0c;基于Python的Spleeter库开发而成。SpleeterGui支持的操作系统包括Windows、macOS和Linux&#xff0c;用户可以根据自己的需求选择合适的版本进行下载和使用。 使用教程 1、解压 人声伴奏分离软件-SpleeterGUI_2.9.5…

前端必知必会-html实体与保留字转换和符号

文章目录 HTML 实体HTML 字符实体一些有用的 HTML 字符实体HTML 符号HTML 符号实体数学符号希腊字母其他一些实体总结 HTML 实体 HTML 中的保留字符必须用实体替换&#xff1a; <&#xff08;小于&#xff09; < >&#xff08;大于&#xff09; >HTML 字符实体 …

C#体检系统源码,医院健康体检系统PEIS,C#+VS2016+SQLSERVER

体检中心/医院体检科PEIS系统源码&#xff0c;C#健康体检信息系统源码&#xff0c;PEIS源码 开发环境&#xff1a;C/S架构C#VS2016SQLSERVER 2008 检前&#xff1a; 多种预约方式网站预约、电话预约、微信平台预约及检前沟通&#xff0c;提前制作套餐&#xff0c;客人到达体检…

内网穿透的应用-中文版个人知识库Trilium笔记本地安装结合内网穿透远程协作

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes的中文版如何在Linux环境使用docker本地部署…

使用 WeNet 训练 AISHELL-1 模型的详细入门指南

使用 WeNet 训练 AISHELL-1 模型的详细入门指南 在这篇文章中&#xff0c;我们将通过 WeNet 框架详细介绍如何训练 AISHELL-1 数据集的语音识别模型。我们将逐步解释各个阶段的操作&#xff0c;适合初学者入门。 1. 环境准备 1.1 安装miniconda miniconda官网 1. 获取下载链…

【Dash】Dash模块介绍

什么是Dash&#xff1f; Dash 是一个开源的 Python 框架&#xff0c;用于创建基于 Web 的应用程序。它由 Plotly 公司开发&#xff0c;专为数据科学家和分析师设计&#xff0c;以便他们可以构建自定义的数据可视化 Web 应用程序&#xff0c;而无需具备前端开发知识。Dash 提供…

Scrapy 爬取旅游景点相关数据(五)

本期内容&#xff1a;&#xff08;1&#xff09;爬取日本其他城市数据存入数据库&#xff08;2&#xff09;爬取景点评论数据 1 爬取其他城市景点数据 只爬取一个城市的数据对于做数据可视化系统可能是不够的&#xff0c;因为数据样本量少嘛&#xff0c;本期来爬取其他城市的景…

Qt之详解QPainter

文章目录 前言QPainter 是干什么的如何使用 QPainter在哪个函数使用 QPainter为什么要在这里使用 QPainter最简单的示例代码 QPainter 函数构造函数与析构函数QPainter()QPainter(QPaintDevice *device)~QPainter() 初始化和结束绘图bool begin(QPaintDevice *device)bool end(…

x-cmd pkg | yazi - 超快终端文件管理器

目录 简介快速入门功能特点竞品和相关项目进一步阅读 简介 yazi 是由 github.com/sxyazi 用 Rust 开发的终端文件管理器&#xff0c;支持预览文本文件、pdf 文件、图像、视频&#xff0c;内置代码高亮功能。在内部&#xff0c;它使用 Tokio 作为其异步运行时&#xff0c;以非阻…

【百度超级智能体】零代码构建趣味语言游戏:秋日寻宝知识问答

前言 文心智能体平台AgentBuilder是由百度推出的一个创新平台&#xff0c;该平台基于其先进的文心大模型。这个平台旨在帮助开发者根据各自的专业领域和应用场景&#xff0c;以灵活多样的开发方法构建定制化的智能体&#xff08;Agent&#xff09;。通过简单易用的prompt编排功…

详解Qt 定时器QTimer

文章目录 前言QTimer 是什么什么时候使用 QTimer定时器时间到了调用什么函数 QTimer 的所有函数构造函数与析构函数QTimer(QObject *parent nullptr) 基本操作void start(int msec)void start()void stop()bool isActive() const 定时器属性void setInterval(int msec)int int…

瑞芯微平台RK3568系统开发(1)安卓环境搭建

1 开发环境搭建 注意: 重要&#xff01;重要&#xff01;重要&#xff01;自己编译后的固件&#xff0c; 必须先确认io_domains(4.2章节)后&#xff0c;才可以下载到板子运行&#xff0c; 否则可能造成烧坏RK3568的情况。 1.1 更新系统 ~$ sudo apt-get update 1.2 安装依…

MATLAB多元函数梯度下降法找最小值-梯度演示-绘制梯度方向

如果海森矩阵在所有可能的参数值上都是正定的&#xff0c;则该函数是凸的&#xff1b;函数将呈现为光滑的碗状&#xff0c;使得训练过程相对简单。存在单 一的全局最小值&#xff0c;不会有局部最小值或鞍点。 沿着梯度方向&#xff0c;函数变化最快。 x&#xff0c;y点的更新…

LNMP动态网站环境部署

1、LINUX部署 stop firewallddisable selinux 2、Nginx部署 ​ vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.…

Java 多线程编程核心技术权威指南(电子版教程)

前言 Java多线程编程是现代软件开发中不可忽视的关键技术&#xff0c;它能有效利用多核处理器的计算能力&#xff0c;实现并发执行&#xff0c;提升系统性能和响应速度。本篇博客将带您深入了解Java线程的核心概念、高级用法以及并发编程中的常见问题与解决方案。无论您是Java…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第1天

一、开发坏境的准备 1&#xff0c;在微软商店下载并安装VS Code 以及谷歌浏览器或者其他浏览器&#xff08;我这里使用的是Microsoft Edge&#xff09; 2&#xff0c;打开vs code &#xff0c;在电脑桌面新建一个文件夹命名为code&#xff0c;将文件夹拖拽到vs code 中的右边…

《python语言程序设计》2018版第6章第19题几何问题点的位置,利用4.31显示如何测试一个点是在一条有向线的左、右还是刚好在线上

# 这个是4.31的代码&#xff0c;一个函数里包含了。在线上&#xff0c;在线左&#xff0c;在线右 def judgePoint(x0, y0, x1, y1, x2, y2):juMethod ((x1 - x0) * (y2 - y0)) - ((x2 - x0) * (y1 - y0))if juMethod > 0:print("p2 is on the left side of the line f…

MATLAB 共轭梯度法求解线性方程组(附代码)

共轭梯度法求解线性方程组 1. 引言 共轭梯度法&#xff08;Conjugate Gradient Method&#xff09;是一种用于求解大型稀疏对称正定线性方程组的迭代算法。该方法结合了梯度下降法和共轭方向的概念&#xff0c;以达到更快速的收敛。共轭梯度法 是介于最速下降法与牛顿法之间的…

Android 11(R) IPC Binder机制 初版

Android 系统分为三层。最上层是application应用层&#xff0c;第二层是framework层&#xff0c;第三层是native层 1.Android 中的应用层和系统服务层不在同一个进程&#xff0c;系统服务在单独的进程中。每个应用的进程都是zygote fork出来的。 2.Android中不同应用属于不同…

数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命

1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台&#xff0c;旨在为电商平台提供深度的数据洞察和业务分析。技术层面&#xff0c;项目涵盖了从基础架构搭建到大数据技术组件的集成&#xff0c;采用了湖仓一体的设计理念&#xff0c;实现了数据仓库与数据湖的有…