当前位置: 首页 > article >正文

qt QWebSocketServer详解

1、概述

QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器,接受客户端的连接,并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,它使得客户端和服务器之间的数据交换变得更加简单和高效。

QWebSocketServer 提供了 WebSocket 服务器所需的基本功能,包括监听端口、接受连接、发送和接收消息等。它通常与 QWebSocket 类一起使用,后者表示一个 WebSocket 连接,并提供了与该连接进行交互的方法。

2、重要方法

QWebSocketServer 类的重要方法包括但不限于:

  • QWebSocketServer(const QString &serverName, QWebSocketServer::NonSecureMode serverType = NonSecureMode, QObject *parent = nullptr): 构造函数,创建一个 WebSocket 服务器实例。
  • bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0): 使服务器监听指定的地址和端口。
  • void close(): 关闭服务器,停止监听连接。
  • QList<QWebSocket *> clients() const: 返回当前连接到服务器的所有客户端列表。
  • bool hasPendingConnections() const: 检查是否有等待接受的连接。
  • QWebSocket *nextPendingConnection(): 接受一个等待中的连接,并返回一个新的 QWebSocket 对象来表示该连接。
  • QString serverName() const: 返回服务器的名称。
  • QWebSocketServer::WebSocketServerState state() const: 返回服务器的当前状态(如监听中、关闭等)。
3、重要信号

QWebSocketServer 类的重要信号包括:

  • newConnection(): 当有新的客户端连接请求时发出。
  • acceptError(QAbstractSocket::SocketErrors socketError):当连接出现错误时发出信号。
  • serverError(0WebSocketProtocol::CloseCode closeCode):当服务器发生错误时发出信号。

4、常用枚举类型

以下是 QWebSocketServer类中一些常用的枚举类型及其简要介绍:
QWebSocketServer::SslMode: SSL 模式。

  • SslMode::NonSecureMode:不支持SSL/TLS
  • SslMode::SecureMode:支持SSL/TLS

5、实现 SSL/TLS 加密
QWebSocketServer 支持 SSL/TLS 加密以提供安全的WebSocket 连接。为了实现SSL/TLS,您需要配置合适的证书和密钥:

QWebSocketServer server("Secure WebSocket Server", QWebSocketServer::SecureMode);
QSslConfiguration sslConfiguration;
sslConfiguration.setLocalCertificate(QStringLiteral("server.crt"));
sslConfiguration.setPrivateKey(QStringLiteral("server.key"));
server.setSslConfiguration(sslConfiguration);

if (server.listen(QHostAddress::Any, 1234)) {
    qDebug() << "Secure WebSocket server listening on port 1234.";
}

//.h
class MyWebSocketClient : public QObject {
    Q_OBJECT

public:
    MyWebSocketClient(QObject *parent = nullptr) : QObject(parent), m_pWebSocket(nullptr) {
        m_pWebSocket = new QWebSocket();

        // 连接服务器
        QUrl serverUrl("ws://localhost:12345"); // 替换为实际的服务器URL
        m_pWebSocket->open(serverUrl);

        // 连接信号和槽
        connect(m_pWebSocket, &QWebSocket::connected, this, &MyWebSocketClient::onConnected);
        connect(m_pWebSocket, &QWebSocket::disconnected, this, &MyWebSocketClient::onDisconnected);
        connect(m_pWebSocket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error), this, &MyWebSocketClient::onError);
        connect(m_pWebSocket, &QWebSocket::textMessageReceived, this, &MyWebSocketClient::onTextMessageReceived);
    }

    ~MyWebSocketClient() {
        m_pWebSocket->close();
    }

private slots:
    void onConnected() {
        qDebug() << "Connected to WebSocket server";

        // 发送消息给服务器
        QString message = "Hello, WebSocket server!";
        m_pWebSocket->sendTextMessage(message);
    }

    void onDisconnected() {
        qDebug() << "Disconnected from WebSocket server";
    }

    void onError(QAbstractSocket::SocketError error) {
        qDebug() << "WebSocket error:" << error;
    }

    void onTextMessageReceived(QString message) {
        qDebug() << "Received message from WebSocket server:" << message;
    }

private:
    QWebSocket *m_pWebSocket;
};



class WebSocketServer : public QObject
{
    Q_OBJECT

public:
    explicit WebSocketServer(quint16 port=12345, QObject *parent = nullptr);
    ~WebSocketServer();

private slots:
    void onNewConnection();
    void onTextMessageReceived(const QString &message);
    void onDisconnected();

private:
    QWebSocketServer *m_server;
    QList<QWebSocket *> m_clients;
};



/************************************/
//.cpp
WebSocketServer::WebSocketServer(quint16 port, QObject *parent)
    : QObject(parent),
      m_server(new QWebSocketServer(QStringLiteral("WebSocket Server"), QWebSocketServer::NonSecureMode, this))
{
    if (m_server->listen(QHostAddress::Any, port)) {
        qDebug() << "WebSocket server listening on port" << port;
        connect(m_server, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);
    } else {
        qDebug() << "Error: Unable to start the WebSocket server:" << m_server->errorString();
    }
}

WebSocketServer::~WebSocketServer()
{
    m_server->close();
    qDeleteAll(m_clients.begin(), m_clients.end());
}

void WebSocketServer::onNewConnection()
{
    QWebSocket *client = m_server->nextPendingConnection();
    connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::onTextMessageReceived);
    connect(client, &QWebSocket::disconnected, this, &WebSocketServer::onDisconnected);
    m_clients << client;
    qDebug() << "New client connected.";
}

void WebSocketServer::onTextMessageReceived(const QString &message)
{
    QWebSocket *client = qobject_cast<QWebSocket *>(sender());
    qDebug() << "Message received:" << message;
    client->sendTextMessage("Echo: " + message);
}

void WebSocketServer::onDisconnected()
{
    QWebSocket *client = qobject_cast<QWebSocket *>(sender());
    if (client) {
        m_clients.removeAll(client);
        client->deleteLater();
        qDebug() << "Client disconnected.";
    }
}


觉得有帮助的话,打赏一下呗。。

           


http://www.kler.cn/a/389191.html

相关文章:

  • Nuxt 版本 2 和 版本 3 的区别
  • MYSQL 库,表 基本操作
  • fastapi 查询参数支持 Pydantic Model:参数校验与配置技巧
  • 想租用显卡训练自己的网络?AutoDL保姆级使用教程(PyCharm版)
  • Spark 核心概念与宽窄依赖的详细解析
  • 【juc】AbstractQueuedSynchronized为什么采用双向链表
  • 第十三届交通运输研究(上海)论坛┆智能网联汽车技术现状与研究实践
  • SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0
  • ssh2-sftp-client一键将你的前端项目部署到远程服务器,你只需要专注写bug就好了
  • Rust:GUI 开源框架
  • 数据库范式、MySQL 架构、算法与树的深入解析
  • 实现rtos操作系统 【二】基本任务切换实现
  • 大模型,智能家居的春秋战国之交
  • goframe开发一个企业网站 验证码17
  • DotNet使用CsvHelper快速读取和写入CSV文件的操作方法
  • Apache DolphinScheduler + OceanBase,搭建分布式大数据调度平台的实践
  • 2411d,右值与移动
  • linux入门教程:perl库
  • 【刷题12】ctfshow刷题
  • 面试官:进程与线程的关系和区别到底是什么?
  • 大数据学习10之Hive高级
  • 【从零开始的LeetCode-算法】540. 有序数组中的单一元素
  • 营收增长,净利润却暴跌695.9%,昆仑万维在赌什么?
  • 后端-内连接(INNER JOIN),左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)的区别
  • 【Vue】-组件开发-一个树组件
  • jpeg2000dataset.cpp:40:10: fatal error: