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);}
}
源碼下載:點擊跳轉???????
覺得有幫助的話,打賞一下唄。。
? ? ? ? ? ?