qt QWebSocket詳解

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 暫存…