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

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_OBJECTpublic:MyWebSocketClient(QObject *parent = nullptr) : QObject(parent), m_pWebSocket(nullptr) {m_pWebSocket = new QWebSocket();// 连接服务器QUrl serverUrl("ws://localhost:12345"); // 替换为实际的服务器URLm_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_OBJECTpublic: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.";}
}

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

           

相关文章:

qt QWebSocketServer详解

1、概述 QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器&#xff0c;接受客户端的连接&#xff0c;并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它使得客户端和服务器之间的数…...

【数据结构】线性表——链表

写在前面 本篇笔记记录线性表——链表的主要形式&#xff0c;虽然链表有8种形式&#xff0c;但是只要精通笔记中编写的两种&#xff0c;即可触类旁通。 文章目录 写在前面一、链表的概念及结构二、链表的分类三、无头单向非循环链表3.1、链表的实现3.1.1、链表的结构体定义3.1…...

Fork突然报错

现象&#xff1a; Could not resolve hostname github.com: No address associated with hostname fatal: Could not read from remote repository. 原因&#xff1a;需要为fork设置代理 步骤&#xff1a; 1.通过winR输入%localappdata%\fork\gitInstance打开文件夹 2.找到…...

Vue Element-UI 选择隐藏表格中的局部字段信息

一、功能需求分析 为什么需要这个功能&#xff1f; &#xff08;1&#xff09;简化信息&#xff0c;减少混乱&#xff1a; 就像整理抽屉&#xff0c;只留下常用的东西&#xff0c;这样找起来更快&#xff0c;看起来也更整洁。在表格中&#xff0c;只展示需要的字段&#xff…...

easyui +vue v-slot 注意事项

https://www.jeasyui.com/demo-vue/main/index.php?pluginDataGrid&themematerial-teal&dirltr&pitemCheckBox%20Selection&sortasc 接口说明 <template><div><h2>Checkbox Selection</h2><DataGrid :data"data" style&…...

vue之组件网站(后续补)

vue移动端 Vant 4 NutUI cube-ui vue电脑端 Element Plus OpenTiny Arco Design Ant Design Vue Vuetify Naive UI react移动端 react vant react移动端 Ant Design NutUI...

大模型的常用指令格式 --> ShareGPT 和 Alpaca (以 llama-factory 里的设置为例)

ShareGPT 格式 提出背景&#xff1a;ShareGPT 格式起初来自于用户在社交平台上分享与聊天模型的对话记录&#xff0c;这些记录涵盖了丰富的多轮对话内容。研究者们意识到&#xff0c;这类真实的对话数据可以帮助模型更好地学习多轮对话的上下文保持、回应生成等能力。因此&…...

【论文阅读】火星语义分割的半监督学习

【论文阅读】火星语义分割的半监督学习 文章目录 【论文阅读】火星语义分割的半监督学习一、介绍二、联系工作3.1Deep Learning for Mars3.2 数据集可以分为三类&#xff1a;3.3 半监督学习 三、提出的火星图像分割数据集四、方法四、实验 S 5Mars: Semi-Supervised Learning …...

ACM社团第一次测试题解(禁止直接复制粘贴提交)

第一题&#xff1a;中位数 思路&#xff1a; 解法一&#xff1a;暴力比较&#xff0c;两个数之间一直比较得出中位数 解法二&#xff1a;快排函数&#xff0c;数组中间值即为中位数 代码&#xff1a; 1.c语言版&#xff1a; #include <stdio.h> int arr[10010]; vo…...

redis:zset有序集合命令和内部编码

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言命令ZADDZRANGEZREVRANGEZCARDZCOUNTZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY集合间操作…...

Day107:代码审计-PHP模型开发篇MVC层RCE执行文件对比法1day分析0day验证

知识点&#xff1a; 1、PHP审计-MVC开发-RCE&代码执行 2、PHP审计-MVC开发-RCE&命令执行 3、PHP审计-MVC开发-RCE&文件对比 MVC 架构 MVC流程&#xff1a; Controller截获用户发出的请求&#xff1b;Controller调用Model完成状态的读写操作&#xff1b;Contr…...

Web服务nginx实验1访问特定目录

启动服务&#xff1a; 创建haha目录&#xff0c;并且在里面创建index.html文件&#xff0c;往里面写东西&#xff1a; 让客户端访问haha目录&#xff1a;&#xff08;默认只会读取里面的index.html文件&#xff09; 目录后面加/显示的是内容&#xff0c;不加则是代码&#xff1…...

数据结构之二叉树前序,中序,后序习题分析(递归图)

1.比较相同的树 二叉树不能轻易用断言&#xff0c;因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历...

Me-LLaMA——用于医疗领域的新型开源大规模语言模型

摘要 大规模语言模型的出现是提高病人护理质量和临床操作效率的一个重大突破。大规模语言模型拥有数百亿个参数&#xff0c;通过海量文本数据训练而成&#xff0c;能够生成类似人类的反应并执行复杂的任务。这在改进临床文档、提高诊断准确性和管理病人护理方面显示出巨大的潜…...

C#-常见异常的处理方式(持续更新)

1、从网络位置加载程序集失败&#xff0c;默认不启用CAS策略 错误原因&#xff1a;使用 Assembly.LoadFile(dllPath) 加载外部Dll时&#xff0c;DotNET安全机制阻止加载一个本地网或互联网上的程序集。 解决方案&#xff1a; ①配置app.config文件&#xff0c;在runtime节点…...

「Mac玩转仓颉内测版2」入门篇2 - 编写第一个Cangjie程序

本篇详细介绍在Mac系统上创建首个Cangjie项目并编写、运行第一个Cangjie程序的全过程。内容涵盖项目创建、代码编写、程序运行与调试&#xff0c;以及代码修改后的重新运行。通过本篇&#xff0c;掌握Cangjie项目的基本操作&#xff0c;进一步巩固开发环境的配置&#xff0c;迈…...

注册登录学生管理系统小项目

头文件 #ifndef _LOGINLINK_H_ #define _LOGINLINK_H_ #include<myhead.h> typedef struct {int id;char name[20];int age; }stu,*Pstu; typedef struct node {union{int len;stu data;};struct node *next; }node,*Pnode; int regist(); int login(); Pnode create()…...

qt QCompleter详解

1、概述 QCompleter是Qt框架中的一个类&#xff0c;用于为文本输入提供自动完成功能。它可以与Qt的输入控件&#xff08;如QLineEdit、QTextEdit等&#xff09;结合使用&#xff0c;根据用户的输入实时过滤数据源&#xff0c;并在输入控件下方或内部显示补全建议列表。用户可以…...

YOLOv11融合特征细化前馈网络 FRFN[CVPR2024]及相关改进思路

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 一、 模块介绍 论文链接&#xff1a;Adapt or Rerish 代码链接&#xff1a;https://github.com/joshyZhou/AST 论文速览&#xff1a;基于 transformer 的方法在图像恢复任务中取得了有希望的性能&#xff0c;因为…...

【前端知识】JS模块规范

JS模块规范 概述CommonJS 规范 代码示例AMD 规范 代码示例ES6 Module 规范 代码示例IIFE 规范 代码示例全局变量 代码示例 CommonJS 模块和 ES6 模块有什么区别&#xff1f;1. 语法和声明方式2. 动态和静态导入3. 循环依赖4. 默认导出和命名导出5. 文件扩展名6. 环境和应用7. 工…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...