天天看點

Qt開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer

若該文為原創文章,轉載請注明原文出處

本文章部落格位址:https://blog.csdn.net/qq21497936/article/details/100547400

長期持續帶來更多項目與技術分享,咨詢請加QQ:21497936、微信:yangsir198808

紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中...(點選傳送門)

Qt開發專欄:開發技術(點選傳送門)

前話

Qt提供的WebSocket功能。

Demo示範

Qt開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer
Qt開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer

雲伺服器Demo示範(2021年04月02日補充)

Qt開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer

如何建立公網伺服器端口,請參考博文:《實用技巧:阿裡雲伺服器建立公網物聯網伺服器(解決阿裡雲伺服器端口,公網連接配接不上的問題)》

雲伺服器Demo示範(2021年04月03日補充)

Qt開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer
Qt開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer

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開發技術:QWebSocket用戶端、服務端介紹與開發Qt開發專欄:開發技術(點選傳送門)前話Demo示範雲伺服器Demo示範(2021年04月02日補充)雲伺服器Demo示範(2021年04月03日補充)Demo體驗下載下傳位址相關部落格WebSocket用戶端:QWebSocketWebSocket服務端:QWebSocketServer

使用

    在工程檔案夾中添加:

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