若該文為原創文章,轉載請注明原文出處
本文章部落格位址:https://blog.csdn.net/qq21497936/article/details/100547400
長期持續帶來更多項目與技術分享,咨詢請加QQ:21497936、微信:yangsir198808
紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中...(點選傳送門)
Qt開發專欄:開發技術(點選傳送門)
前話
Qt提供的WebSocket功能。
Demo示範
雲伺服器Demo示範(2021年04月02日補充)
如何建立公網伺服器端口,請參考博文:《實用技巧:阿裡雲伺服器建立公網物聯網伺服器(解決阿裡雲伺服器端口,公網連接配接不上的問題)》
雲伺服器Demo示範(2021年04月03日補充)
Demo體驗下載下傳位址
CSDN 0積分下載下傳位址: https://download.csdn.net/download/qq21497936/16128790
QQ群:1047134658(點選“檔案”搜尋“webSocket”,群内與博文同步更新所有可開源的源碼模闆)
相關部落格
《實用技巧:阿裡雲伺服器建立公網物聯網伺服器(解決阿裡雲伺服器端口,公網連接配接不上的問題)》
《Qt開發技術:QWebSocket用戶端、服務端介紹與開發》
《Qt開發技術:mqtt介紹、QtMqtt編譯和開發環境搭建》
《Mqtt開發筆記:Mqtt伺服器搭建》
《項目實戰:Qt并發伺服器通訊,受同一時刻最大線程數限制(筆者本本同一時刻600多)》
《Qt實用技巧:80顯示超大顯示拼接(十台伺服器,每台八路攝像頭)方案和Demo》
WebSocket用戶端:QWebSocket
簡介
實作一個TCP套接字,該套接字與WebSocket協定進行通信。
WebSockets是一種通過單個TCP連接配接提供全雙工通信通道的Web技術。WebSocket協定在2011年被IETF标準化為RFC 6455。QWebSocket既可用于用戶端應用程式,也可用于伺服器應用程式。
WebSockets的使用參照QTcpServer。
QWebSocket這個類是根據QAbstractSocket模組化的。
QWebSocket目前不支援WebSocket擴充和WebSocket子工具。
QWebSocket僅支援WebSocket協定的版本13,如RFC6455所述。
注意:有些代理不了解WebSocket握手過程中使用的某些HTTP頭。在這種情況下,不安全的WebSocket連接配接會失敗。緩解此問題的最佳方法是在安全連接配接上使用WebSocket。
警告:要生成掩碼,WebSockets的此實作使用加密不安全的qrand()函數。有關良好遮蔽的重要性的更多資訊,請參見林順煌等人的“與自己交談,尋求樂趣和利益”。防範上述文檔中提到的攻擊的最佳措施是通過安全連接配接(wss://)使用QWebSocket。一般來說,請務必小心不要讓第三方腳本通路應用程式中的QWebSocket。
使用
在工程檔案夾中添加:
QT += websockets
包含該類
#include <QWebSocket>
使用時先new一個QWebsocket,然後關聯其connected(),disconnected(),error(),textFrameReceived()(或者textMessageReceived()信号,兩個收到消息的信号都會觸發),發送調用sendTextMessage()函數即可。
部分代碼
WebSocketClientManager.h
#ifndef WEBSOCKETCLIENTMANAGER_H
#define WEBSOCKETCLIENTMANAGER_H
/************************************************************\
* 控件名稱: WebSocket用戶端管理類
* 控件描述:
* 1.類似于QTcpServer操作
* 作者:紅模仿 聯系方式:QQ21497936
* 部落格位址:https://blog.csdn.net/qq21497936
* 日期 版本 描述
* 2019年09月04日 v1.0.0 基礎功能
\************************************************************/
#include <QObject>
#include <QWebSocket>
class WebSocketClientManager : public QObject
{
Q_OBJECT
public:
explicit WebSocketClientManager(QObject *parent = nullptr);
~WebSocketClientManager();
public:
bool running() const;
QString url() const;
void setUrl(const QString &url);
signals:
void signal_connected();
void signal_disconnected();
void signal_sendTextMessageResult(bool result);
void signal_sendBinaryMessageResult(bool result);
void signal_error(QString errorString);
void signal_textFrameReceived(QString frame, bool isLastFrame);
void signal_textMessageReceived(QString message);
public slots:
void slot_start();
void slot_stop();
void slot_connectedTo(QString url);
void slot_sendTextMessage(const QString &message);
void slot_sendBinaryMessage(const QByteArray &data);
protected slots:
void slot_connected();
void slot_disconnected();
void slot_error(QAbstractSocket::SocketError error);
void slot_textFrameReceived(const QString &frame, bool isLastFrame);
void slot_textMessageReceived(const QString &message);
private:
bool _running;
QString _url;
bool _connected;
QWebSocket *_pWebSocket;
};
#endif // WEBSOCKETCLIENTMANAGER_H
WebSocket服務端:QWebSocketServer
簡介
實作基于WebSocket的伺服器。
它是以QTcpServer為模型的,并且行為相同。使用參照QTcpServer。這個類使得接受傳入的WebSocket連接配接成為可能。您可以指定端口或讓QWebSocketServer自動選擇一個端口。您可以監聽一個特定的位址或機器的所有位址。調用listen()讓伺服器監聽傳入的連接配接。
然後,每次用戶端連接配接到伺服器時都會發出newConnection()信号。調用nextPendingConnection()将挂起的連接配接接受為已連接配接的QWebSocket。函數傳回指向QabstractSocket::ConnectedState中QWebSocket的指針,可以使用該指針與用戶端通信。
如果發生錯誤,ServerError()傳回錯誤類型,并且可以調用ErrorString()以擷取對所發生情況的人類可讀描述。
偵聽連接配接時,伺服器正在偵聽的位址和端口可用作serverAddress()和serverPort()。
調用close()将使QWebSocketServer停止偵聽傳入的連接配接。
QWebSocket伺服器目前不支援WebSocket擴充和WebSocket子工具。
注意:使用自簽名證書時,Firefox bug 594502會阻止firefox連接配接到安全的Websocket伺服器。要解決此問題,請首先使用https浏覽到安全WebSocket伺服器。Firefox将訓示證書無效。從這裡開始,可以将證書添加到異常中。在這之後,安全WebSockets連接配接應該可以工作。
QWebSocketServer僅支援WebSocket協定的版本13,如RFC6455所述。
枚舉
enum QWebSocketServer::SslMode
訓示伺服器是通過wss(SecureMode)還是ws(NonSecureMode)運作。
使用
在工程檔案夾中添加:
QT += websockets
包含該類
#include <QWebSocketServer>
使用時先new一個QWebSocketServer,傳入伺服器名稱和是否使用安全模式(安全模式wss,非安全模式ws),然後關聯其newConnected(),closed(),serverError()。
當收到新的連接配接後,則是轉換為QWebSocket,然後關聯其connected(),disconnected(),error(),textFrameReceived()(或者textMessageReceived()信号,兩個收到消息的信号都會觸發),發送調用sendTextMessage()函數即。
部分代碼
WebSocketServerManager.h
#ifndef WEBSOCKETSERVERMANAGER_H
#define WEBSOCKETSERVERMANAGER_H
/************************************************************\
* 控件名稱: WebSocket伺服器管理類
* 控件描述:
* 1.類似于QTcpSocket操作
* 作者:紅模仿 聯系方式:QQ21497936
* 部落格位址:https://blog.csdn.net/qq21497936
* 日期 版本 描述
* 2019年09月04日 v1.0.0 基礎功能
\************************************************************/
#include <QObject>
#include <QWebSocketServer>
#include <QThread>
class WebSocketServerManager : public QObject
{
Q_OBJECT
public:
explicit WebSocketServerManager(QString serverName,
QWebSocketServer::SslMode secureMode = QWebSocketServer::NonSecureMode,
QObject *parent = 0);
~WebSocketServerManager();
public:
bool running() const;
signals:
void signal_conncted(QString ip, qint32 port);
void signal_disconncted(QString ip, qint32 port);
void signal_sendTextMessageResult(QString ip, quint32 port, bool result);
void signal_sendBinaryMessageResult(QString ip, quint32 port, bool result);
void signal_error(QString ip, quint32 port, QString errorString);
void signal_textFrameReceived(QString ip, quint32 port, QString frame, bool isLastFrame);
void signal_textMessageReceived(QString ip, quint32 port,QString message);
void signal_close();
public slots:
void slot_start(QHostAddress hostAddress = QHostAddress(QHostAddress::Any), qint32 port = 10080);
void slot_stop();
void slot_sendData(QString ip, qint32 port, QString message);
protected slots:
void slot_newConnection();
void slot_serverError(QWebSocketProtocol::CloseCode closeCode);
void slot_closed();
protected slots:
void slot_disconnected();
void slot_error(QAbstractSocket::SocketError error);
void slot_textFrameReceived(const QString &frame, bool isLastFrame);
void slot_textMessageReceived(const QString &message);
private:
QString _serverName;
QWebSocketServer::SslMode _sslMode;
bool _running;
QWebSocketServer *_pWebSocketServer;
QHash<QString, QWebSocket*> _hashIpPort2PWebSocket;
QHostAddress _listenHostAddress;
qint32 _listenPort;
};
#endif // WEBSOCKETSERVERMANAGER_H
若該文為原創文章,轉載請注明原文出處
本文章部落格位址:https://blog.csdn.net/qq21497936/article/details/100547400