1、概述

QWebSocket是Qt网络模块中的一个类,用于实现WebSocket协议的通信。WebSocket是一种全双工的通信协议,允许在客户端和服务器之间建立实时的双向通信。QWebSocket提供了对WebSocket协议的支持,使得开发者能够在Qt应用中方便地实现实时通信功能。它在需要实时数据传输、消息推送等场景中非常常见,如聊天室、实时数据流、在线游戏等

2、重要方法

  • QWebSocket(const QString &origin = QString(), QWebSocketProtocol::Version version = QWebSocketProtocol::VersionLatest, QObject *parent = nullptr):构造函数,用于创建一个QWebSocket对象。origin参数指定了WebSocket连接的来源,version参数指定了WebSocket协议的版本,parent参数指定了父对象。

  • virtual ~QWebSocket() override:析构函数,用于销毁QWebSocket对象。

  • void abort():立即关闭WebSocket连接,不发送关闭帧。

  • qint64 bytesToWrite() const:返回待发送的字节数。

  • QWebSocketProtocol::CloseCode closeCode() const:返回WebSocket连接关闭的原因代码。

  • QString closeReason() const:返回WebSocket连接关闭的原因文本。

  • QAbstractSocket::SocketError error() const:返回最近一次发生的错误类型。

  • QString errorString() const:返回最近一次错误的描述信息。

  • bool flush():尝试将所有待发送的数据发送出去。

  • void ignoreSslErrors(const QList<QSslError> &errors):忽略指定的SSL错误。

  • bool isValid() const:检查WebSocket连接是否有效。

  • QHostAddress localAddress() const:返回本机的IP地址。

  • quint16 localPort() const:返回本机的端口号。

  • const QMaskGenerator *maskGenerator() const:返回当前使用的掩码生成器。

  • QString origin() const:返回WebSocket连接的来源。

  • QAbstractSocket::PauseModes pauseMode() const:返回当前的暂停模式。

  • QHostAddress peerAddress() const:返回对端的IP地址。

  • QString peerName() const:返回对端的主机名。

  • quint16 peerPort() const:返回对端的端口号。

  • QNetworkProxy proxy() const:返回当前使用的代理。

  • qint64 readBufferSize() const:返回读取缓冲区的大小。

  • QNetworkRequest request() const:返回当前的网络请求。

  • QUrl requestUrl() const:返回请求的URL。

  • QString resourceName() const:返回资源名称。

  • void resume():恢复暂停的连接。

  • qint64 sendBinaryMessage(const QByteArray &data):发送一个二进制消息。

  • qint64 sendTextMessage(const QString &message):发送一个文本消息。

  • void setMaskGenerator(const QMaskGenerator *maskGenerator):设置掩码生成器。

  • void setPauseMode(QAbstractSocket::PauseModes pauseMode):设置暂停模式。

  • void setProxy(const QNetworkProxy &networkProxy):设置代理。

  • void setReadBufferSize(qint64 size):设置读取缓冲区的大小。

  • void setSslConfiguration(const QSslConfiguration &sslConfiguration):设置SSL配置。

  • QSslConfiguration sslConfiguration() const:返回当前的SSL配置。

  • QAbstractSocket::SocketState state() const:返回当前的连接状态。

  • QWebSocketProtocol::Version version() const:返回当前使用的WebSocket协议版本。

  • void close(QWebSocketProtocol::CloseCode closeCode = QWebSocketProtocol::CloseCodeNormal, const QString &reason = QString()):关闭WebSocket连接,可以指定关闭代码和原因。

  • void ignoreSslErrors():忽略所有SSL错误。

  • void open(const QNetworkRequest &request):使用QNetworkRequest打开WebSocket连接。

  • void open(const QUrl &url):使用URL打开WebSocket连接。

  • void ping(const QByteArray &payload = QByteArray()):发送一个Ping帧,可选地携带负载。

3、信号

  • void aboutToClose():即将关闭连接时发出。

  • void binaryFrameReceived(const QByteArray &frame, bool isLastFrame):收到二进制帧时发出。

  • void binaryMessageReceived(const QByteArray &message):收到二进制消息时发出。

  • void bytesWritten(qint64 bytes):成功写入字节时发出。

  • void connected():连接成功时发出。

  • void disconnected():连接断开时发出。

  • void error(QAbstractSocket::SocketError error):发生错误时发出。

  • void pong(quint64 elapsedTime, const QByteArray &payload):收到Pong响应时发出。

  • void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator):需要预共享密钥认证时发出。

  • void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator):需要代理认证时发出。

  • void readChannelFinished():读取通道关闭时发出。

  • void sslErrors(const QList<QSslError> &errors):SSL错误发生时发出。

  • void stateChanged(QAbstractSocket::SocketState state):连接状态改变时发出。

  • void textFrameReceived(const QString &frame, bool isLastFrame):收到文本帧时发出。

  • void textMessageReceived(const QString &message):收到文本消息时发出。

4、实例

//.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QDir>
#include <iomanip>
#include <sstream>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE#include <QDebug>
#include <QWebSocketServer>
#include <QtWebSockets>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//serverQWebSocketServer* m_server = nullptr;QList<QWebSocket*> m_clients;//clientQWebSocket m_client;
public slots:void on_disconnected();void on_textMessageReceived(const QString &message);void connected();void disconnected();void textMessageReceived(const QString &message);
private slots:void on_pushButton_5_clicked();void on_pushButton_6_clicked();void on_pushButton_2_clicked();void on_pushButton_clicked();void on_newConnection();            // 有新的客户端连接void on_closed();                   // 关闭监听成功
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("WebSocket");m_server = new QWebSocketServer("web服务端", QWebSocketServer::NonSecureMode, this);connect(m_server, &QWebSocketServer::newConnection, this, &MainWindow::on_newConnection);connect(m_server, &QWebSocketServer::closed, this, &MainWindow::on_closed);connect(&m_client, &QWebSocket::connected, this, &MainWindow::connected);connect(&m_client, &QWebSocket::textFrameReceived, this, &MainWindow::textMessageReceived);connect(&m_client, &QWebSocket::disconnected, this, &MainWindow::disconnected);}MainWindow::~MainWindow()
{delete ui;
}/*** @brief 有新的客户端发起连接*/
void MainWindow::on_newConnection()
{QWebSocket* client = m_server->nextPendingConnection();   // 获取连接成功的客户端connect(client, &QWebSocket::textMessageReceived, this, &MainWindow::on_textMessageReceived);connect(client, &QWebSocket::disconnected, this, &MainWindow::on_disconnected);// 将所有客户端加入列表m_clients << client;ui->textEdit_3->append(QString("[%1:%2] 连接成功!").arg(client->peerAddress().toString()).arg(client->peerPort()));
}/*** @brief 服务端关闭监听,关闭后不再接收新的客户端的连接请求*/
void MainWindow::on_closed()
{ui->textEdit->append("服务端关闭监听!");ui->pushButton_5->setText("开启监听");
}void MainWindow::on_pushButton_5_clicked()
{//TcpServer::get()->startServer(ui->lineEdit_5->text().toInt());if(!m_server->isListening()){bool ret = m_server->listen(QHostAddress::AnyIPv4, ui->lineEdit_5->text().toInt());if(ret){ui->textEdit_3->append(QString("开始监听:%1").arg(m_server->serverUrl().toString()));ui->pushButton_5->setText("停止");}}else{m_server->close();}
}/*** @brief 向所有连接的客户端发送数据*/
void MainWindow::on_pushButton_6_clicked()
{QString data = ui->textEdit_4->toPlainText();for(auto client : m_clients){client->sendTextMessage(data);}
}/*** @brief 断开连接时移除对应的客户端*/
void MainWindow::on_disconnected()
{QWebSocket *socket = qobject_cast<QWebSocket *>(sender());for(int i = 0; i < m_clients.count(); ++i){if(m_clients.at(i) == socket){disconnect(socket, &QWebSocket::textMessageReceived, this, &MainWindow::on_textMessageReceived);disconnect(socket, &QWebSocket::disconnected, this, &MainWindow::on_disconnected);m_clients.removeAt(i);break;}}ui->textEdit->append(QString("[%1:%2] 断开连接!").arg(socket->peerAddress().toString()).arg(socket->peerPort()));
}/*** @brief          接收信息并将信息转发给所有客户端* @param message*/
void MainWindow::on_textMessageReceived(const QString &message)
{QWebSocket *socket = qobject_cast<QWebSocket *>(sender());for(auto client : m_clients){if(client != socket)   // 向所有连接的客户端转发信息,除了当前信息的发出者{client->sendTextMessage(message);}}ui->textEdit_3->append(QString("[%1:%2] %3").arg(socket->peerAddress().toString()).arg(socket->peerPort()).arg(message));
}void MainWindow::connected()
{ui->textEdit_2->append("连接成功!");
}void MainWindow::disconnected()
{ui->textEdit_2->append("断开连接!");
}/*** @brief          接收数据* @param message*/
void MainWindow::textMessageReceived(const QString &message)
{ui->textEdit_2->append(message);
}void MainWindow::on_pushButton_2_clicked()
{m_client.open(QUrl(ui->lineEdit->text().trimmed()));
}void MainWindow::on_pushButton_clicked()
{QString data = ui->textEdit->toPlainText();if(m_client.state() == QAbstractSocket::ConnectedState)    // 判断是否连接{m_client.sendTextMessage(data);}
}

源码下载:点击跳转​​​​​​​

点击扫码加入群聊

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

Java基础IO流全解析:常用知识点与面试高频考点汇总

Java基础IO流全解析&#xff1a;常用知识点与面试高频考点汇总 前言 IO&#xff08;Input/Output&#xff09;流是Java中处理数据传输的核心机制&#xff0c;无论是文件操作、网络通信还是数据持久化&#xff0c;都离不开IO流的身影。对于Java初学者而言&#xff0c;IO流的分类…

PDF.AI-与你的PDF文档对话

本文转载自&#xff1a;PDF.AI-与你的PDF文档对话 - Hello123工具导航 ** 一、&#x1f916; PDF.AI&#xff1a;秒懂 PDF 的智能对话助手 PDF.AI 是一款超实用的AI 文档分析工具&#xff0c;专门帮你快速搞定各种 PDF 文件。不管多长的合同、报告或论文&#xff0c;你只需上…

微软出品!这个免费开源工具集获得了GitHub 123k程序员点赞

大家晚上好&#xff0c;我是顾北&#xff0c;是一名AI应用探索者&#xff0c;当然也是GitHub开源项目收集爱好者。最近我在整理Windows效率工具时&#xff0c;发现了一个让我一晚上没睡着觉的开源项目——微软官方出品的 PowerToys&#xff0c;可谓是彻夜难眠啊。经过我两个月多…

【开题答辩全过程】以 小众商户小程序为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Vue 3.5 重磅新特性:useTemplateRef 让模板引用更优雅、更高效!

Vue 3.5 重磅新特性:useTemplateRef 让模板引用更优雅、更高效! 目录 前言 什么是 useTemplateRef 传统 ref 的问题 useTemplateRef 的优势 基础用法 进阶用法 最佳实践 迁移指南 性能对比 注意事项 总结 前言 Vue 3.5 带来了一个激动人心的新特性 useTemplateRef,它彻底革…

uni app 的app端 写入运行日志到指定文件夹。

uni app 的app 端 写入指定目录文件夹。并自动生成当前日期的日志文件。删除十日前的日志文件其中 writefile.js 代码如下const {default: logger } require("./logger")var name var url var params var method var resfunction setlog(name, url, params, method)…

桌面应用开发语言与框架选择指南

桌面应用开发的语言和框架选择非常丰富&#xff0c;从原生性能到跨平台解决方案应有尽有。下面我将它们分为几大类进行详细介绍&#xff0c;并附上各自的优缺点和适用场景。 一、 原生开发 (Native Development) 原生开发能提供最佳的性能和与操作系统最完美的集成体验。 1. …

C++知识

文章目录1.Cmap为什么线程不安全?2.map大量插入会有性能问题&#xff0c;为什么3.set的应用场景4.map set mutiset mutimap unordered_map unordered_set的底层实现、使用场景、优缺点1.Cmap为什么线程不安全? 其实STL中的容器都是线程不安全的&#xff0c;如果想要线程安全…

自学嵌入式第三十四天:网络编程-TCP

一、UDP用户数据报收发次数要对应&#xff1b;数据与数据之间有边界&#xff0c;多次调用收发时都是不同的数据报&#xff1b;接收方的数据大小>发送方的数据大小&#xff0c;如果接受方数据小了则会丢弃未读的部分&#xff0c;再次调用只会读下一包数据&#xff1b;二、服务…

Apache IoTDB:国产时序数据库的崛起与工业物联网的未来

&#x1f4d1;前言 在工业物联网的浪潮中&#xff0c;数据不再是副产品&#xff0c;而是驱动决策的核心资产。"随着物联网、工业互联网和智能监控的迅猛发展&#xff0c;时序数据正以前所未有的速度爆发。据预测&#xff0c;到2025年全球物联网设备将达750亿台&#xff0c…

一键核验,安全无忧!手机号三要素详情版API,为您的业务筑牢身份认证防线

一、什么是手机号三要素核验API&#xff1f; 手机号三要素核验API 是一种通过编程接口&#xff0c;实时验证一条个人身份信息是否与该国运营商登记的实名信息一致的在线服务。 这里的“三要素”特指&#xff1a; 姓名 身份证号码 手机号码 核验过程&#xff1a;用户提交上述三个…

轻松上手 qData 数据中台开源版:Docker Compose 助你10分钟跑起来

说在前面 谁适合看这份指南&#xff1f; 初次接触 qData&#xff0c;希望快速体验功能的小伙伴不想折腾复杂环境配置和前端打包的人想用“一键启动”省事体验完整平台的用户 我们已经为你准备好“开箱即用”的完整部署包&#xff0c;包括&#xff1a; ✅ 前端静态资源&…

Qt读写Excel--QXlsx基本使用

1、概述 Document 类是一个用于操作 XLSX 文件的类&#xff0c;继承自 QObject。它提供了对 Excel 文件的读写操作&#xff0c;包括单元格的读写、图片和图表的插入、单元格合并、列和行的格式化、数据验证和条件格式化等功能。此外&#xff0c;它还支持对工作簿和工作表的操作…

P13929 [蓝桥杯 2022 省 Java B] 山 题解

缩减一下题目的意思&#xff0c;问区间 [2022,2022222022] 有多少个数是回文数并且先单调不减&#xff0c;后单调不增。 因为有这两条条件&#xff0c;我们可以得知在判断时只用判断前半段的每个数是不是和对面相应的位置相等&#xff0c;以及是否单调不减。 为什么不用看后半段…

Unity Android 文件的读写

配置AndroidManifest 文件在Assets 目录下查找AndroidManifest 文件&#xff0c;添加权限声明&#xff0c;在application 节点中添加requestLegacyExternalStorage 属性。<!-- 权限声明 --> <uses-permission android:name"android.permission.READ_EXTERNAL_STO…

Pydantic模型验证测试:你的API数据真的安全吗?

url: /posts/03b2afdf35f55dbaef631710ab6da82c/ title: Pydantic模型验证测试:你的API数据真的安全吗? date: 2025-09-03T23:46:18+08:00 lastmod: 2025-09-03T23:46:18+08:00 author: cmdragon summary: Pydantic在FastAPI中用于数据验证和序列化,通过Python类型注解自动…

【Proteus仿真】AT89C51单片机中断系列仿真——INT0中断控制LED小灯/INT0和INT1中断控制数码管

目录 0案例视频效果展示 0.1例子1&#xff1a;INT0控制LED闪烁 0.2例子2&#xff1a;INT0中断控制数码管计数 0.3例子3&#xff1a;INT0中断实现秒表功能 0.4例子4&#xff1a;INT0INT1中断控制数码管计数 1基础知识补充——中断系统 1.1 中断源一览 1.2 控制寄存器 1…

MTK Linux DRM分析(三十三)- MTK mtk_mipi_tx.c

一、MIPI PHY驱动简介 1. MIPI 协议分层 应用层:显示(DSI)、摄像头(CSI)。 协议层:定义像素/图像帧如何封装成数据包。 物理层(PHY):具体电气信号传输方式 —— 这里就是 D-PHY 或 C-PHY。 2. D-PHY(Differential PHY) 传输方式:差分信号(类似 LVDS/USB/PCIe …

G2D 图形加速器

文章目录G2D 图形加速器1. 功能简介1.1 矩形填充1.2 旋转和镜像 (rotate and mirror)1.3 透明度混合1.4 colorkey1.5 缩放 (Stretchblt)2. G2D 框架3. 全志 G2D 使用示例3.1 使用G2D实现图像旋转缩放3.2 实时预览中加入旋转缩放功能G2D 图形加速器 G2D模块主要实现图像旋转、数…

【FPGA】单总线——DS18B20

目录 项目&#xff1a;项目&#xff08;含quartus工程、仿真文件&#xff09; 1. 单总线通信时序详解 1.1 初始化&#xff08;复位脉冲 存在脉冲&#xff09; 1.2 写时隙&#xff08;写“0”和写“1”&#xff09; 1.3 读时隙 2. DS18B20 暂存器与温度数据格式 2.1 暂存…