Qt开发技术:QWebSocket客户端、服务端介绍与开发

简介: Qt开发技术:QWebSocket客户端、服务端介绍与开发

若该文为原创文章,转载请注明原文出处

本文章博客地址: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


相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
网络协议
【qt】TCP客户端信息的接受和发送
【qt】TCP客户端信息的接受和发送
34 0
|
3月前
|
网络协议
【qt】TCP客户端如何断开连接?
【qt】TCP客户端如何断开连接?
63 0
|
2月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
2月前
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
140 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02
|
3月前
|
存储 运维 监控
Qt开发网络嗅探器01
Qt开发网络嗅探器01
|
3月前
|
网络协议 容器
Qt开发网络嗅探器03
Qt开发网络嗅探器03
|
3月前
【qt】客户端连接到服务器
【qt】客户端连接到服务器
61 0
|
3月前
|
网络协议
【qt】TCP服务端发消息给客户端
【qt】TCP服务端发消息给客户端
31 0