用QWebSocketServer写websocket服务端
1. 引入必要的头文件
#include <QCoreApplication>
#include <QWebSocketServer>
#include <QWebSocket>
#include <QDebug>
#include <QObject>
QCoreApplication:用于创建控制台应用的事件循环。QWebSocketServer:提供 WebSocket 服务端的接口,用于监听和管理客户端连接。QWebSocket:表示每个客户端连接的 WebSocket 通道。QDebug:用于输出调试信息。QObject:所有 Qt 对象的基类,提供信号和槽机制。
2. 定义 WebSocketServer 类
class WebSocketServer : public QObject
{Q_OBJECTpublic:WebSocketServer(quint16 port, QObject *parent = nullptr);~WebSocketServer();private slots:void onNewConnection();void onTextMessageReceived(const QString &message);void onClientDisconnected();void onClosed();private:QWebSocketServer *m_server;QList<QWebSocket *> m_clients;
};
- WebSocketServer 类:自定义的 WebSocket 服务端类,继承自
QObject。 - 构造函数:接受一个端口号,创建并启动 WebSocket 服务端。
- 析构函数:关闭服务端并清理所有客户端连接。
- 槽函数:用于处理新连接、接收消息、客户端断开连接、和服务端关闭的事件。
- 私有成员变量:
m_server:QWebSocketServer对象,用于监听和处理客户端连接。m_clients:存储所有连接的客户端。
3. 构造函数和析构函数
WebSocketServer::WebSocketServer(quint16 port, QObject *parent): QObject(parent), m_server(new QWebSocketServer(QStringLiteral("Echo 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);connect(m_server, &QWebSocketServer::closed, this, &WebSocketServer::onClosed);}
}WebSocketServer::~WebSocketServer() {m_server->close();qDeleteAll(m_clients.begin(), m_clients.end());
}
- 构造函数:启动服务端监听指定的端口,并连接
newConnection信号(处理新客户端连接)和closed信号(处理服务端关闭)。 - 析构函数:关闭服务端并清理所有客户端连接,以确保内存不会泄漏。
4. 处理新客户端连接
void WebSocketServer::onNewConnection() {QWebSocket *client = m_server->nextPendingConnection();connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::onTextMessageReceived);connect(client, &QWebSocket::disconnected, this, &WebSocketServer::onClientDisconnected);m_clients << client;qDebug() << "New client connected";
}
onNewConnection:在 newConnection 信号触发时调用,处理新的客户端连接。
- 获取新连接的
QWebSocket对象。 - 将新客户端的
textMessageReceived信号连接到onTextMessageReceived槽函数,用于处理客户端发送的消息。 - 将
disconnected信号连接到onClientDisconnected槽函数,用于清理断开的客户端。 - 将新连接添加到客户端列表
m_clients中,方便后续管理。
5. 处理客户端消息
void WebSocketServer::onTextMessageReceived(const QString &message) {QWebSocket *senderClient = qobject_cast<QWebSocket *>(sender());if (senderClient) {qDebug() << "Message received:" << message;senderClient->sendTextMessage("Echo: " + message);}
}
onTextMessageReceived:当客户端发送文本消息时被调用。
sender()获取发送该信号的客户端对象,将其转换为QWebSocket类型。- 输出接收到的消息,并将其回显给客户端。
6. 处理客户端断开连接
void WebSocketServer::onClientDisconnected() {QWebSocket *client = qobject_cast<QWebSocket *>(sender());if (client) {m_clients.removeAll(client);client->deleteLater();qDebug() << "Client disconnected";}
}
onClientDisconnected:在客户端断开连接时调用。
- 获取断开连接的客户端对象,将其从
m_clients列表中移除。 - 调用
deleteLater()延迟删除对象,释放其内存。
7. 处理服务端关闭
void WebSocketServer::onClosed() {qDebug() << "Server closed";
}
整体代码
#include <QCoreApplication>
#include <QWebSocketServer>
#include <QWebSocket>
#include <QDebug>
#include <QObject>class WebSocketServer : public QObject
{Q_OBJECTpublic:WebSocketServer(quint16 port, QObject *parent = nullptr) : QObject(parent), m_server(new QWebSocketServer(QStringLiteral("Echo 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);connect(m_server, &QWebSocketServer::closed, this, &WebSocketServer::onClosed);}}~WebSocketServer() {m_server->close();qDeleteAll(m_clients.begin(), m_clients.end());}private slots:void onNewConnection() {QWebSocket *client = m_server->nextPendingConnection();connect(client, &QWebSocket::textMessageReceived, this, &WebSocketServer::onTextMessageReceived);connect(client, &QWebSocket::disconnected, this, &WebSocketServer::onClientDisconnected);m_clients << client;qDebug() << "New client connected";}void onTextMessageReceived(const QString &message) {QWebSocket *senderClient = qobject_cast<QWebSocket *>(sender());if (senderClient) {qDebug() << "Message received:" << message;senderClient->sendTextMessage("Echo: " + message);}}void onClientDisconnected() {QWebSocket *client = qobject_cast<QWebSocket *>(sender());if (client) {m_clients.removeAll(client);client->deleteLater();qDebug() << "Client disconnected";}}void onClosed() {qDebug() << "Server closed";}private:QWebSocketServer *m_server;QList<QWebSocket *> m_clients;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);WebSocketServer server(9000);return a.exec();
}相关文章:
用QWebSocketServer写websocket服务端
1. 引入必要的头文件 #include <QCoreApplication> #include <QWebSocketServer> #include <QWebSocket> #include <QDebug> #include <QObject>QCoreApplication:用于创建控制台应用的事件循环。QWebSocketServer:提供 …...
云原生后端:现代应用架构的核心力量
云原生后端:现代应用架构的核心力量 云原生后端是基于云环境进行设计和开发的一种理念,利用云服务和云原生技术构建的服务端应用。它旨在提供灵活、高效、弹性和可扩展的解决方案,成为推动应用现代化的核心力量。本文将详细探讨云原生后端的…...
arcgis中dem转模型导入3dmax
文末分享素材 效果 1、准备数据 (1)DEM (2)DOM 2、打开arcscene软件 3、加载DEM、DOM数据 4、设置DOM的高度为DEM...
Python自动化测试中的Mock与单元测试实战
在软件开发过程中,自动化测试是确保代码质量和稳定性的关键一环。而Python作为一门灵活且强大的编程语言,提供了丰富的工具和库来支持自动化测试。本文将深入探讨如何结合Mock与单元测试,利用Python进行自动化测试,以提高代码的可…...
物联网海量数据下的时序数据库选型:InfluxDB、TDEngine、MongoDB与HBase对比与建议
随着物联网(IoT)的普及,各行业纷纷部署大量传感器、设备生成的数据流,面对如此海量的时间序列数据,如何高效存储、查询和分析成为关键。为此,时序数据库(Time Series Database, TSDB)…...
Python中的数据可视化:Matplotlib基础与高级技巧
Python中的数据可视化:Matplotlib基础与高级技巧 数据可视化是数据分析和数据科学中不可或缺的一部分。通过图表,我们可以更直观地观察数据的分布和趋势。Matplotlib作为Python最基础、也是最广泛使用的绘图库之一,不仅支持多种常用图表&…...
数组名和指针数组名深度复习
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //sizeof只关注占用内存空间的大小,不在乎内存中存放的是什么 //是操作符 /* int main() { char arr[] { "abcdef" }; //a b c d e f \0 printf("%d\n", sizeof(arr));//…...
Linux 诞生
目录 Linux诞生背景 Linus Torvalds的创举 Linux内核的首次发布 Linux诞生背景 在计算机操作系统的发展史上,Linux是一个重要的里程碑。它的诞生源于对自由、开放和协作精神的追求,以及对Unix操作系统的深入研究和改进。 在1991年之前,Un…...
借助Aspose.Email,管理受密码保护的 PST 文件
在当今的数字环境中,保护您的数据比以往任何时候都更加重要。确保您的电子邮件数据受到密码保护是维护安全性的关键步骤。对于使用 Microsoft Outlook 数据的开发人员来说,管理受密码保护的 PST(个人存储表)文件可能是一项关键任务…...
MySQL数据库MHA高可用
目录 一、MHA简述 二、MHA 的组成 三、MHA 的特点 四、MHA工作原理 五、MHA部署步骤 六、搭建 MySQL MHA MHA一主两从高可用集群示意图 实验环境 1. Master、Slave1、Slave2 节点上安装 mysql5.7 2. 关闭防火墙 3. 修改 Master、Slave1、Slave2 节点的主机名 4. 修…...
DevEco Studio使用技巧和插件推荐
DevEco Studio是一款强大的集成开发环境(IDE),为开发者提供了丰富的功能和插件。以下是一些使用技巧和插件推荐: 使用技巧 设置中文界面: 打开DevEco Studio,选择“Configure”,再点击“Prefer…...
使用Node.js与Express构建RESTful API
💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用Node.js与Express构建RESTful API 1 引言 2 Node.js与Express简介 3 安装Node.js与Express 4 创建Express项目 5…...
从0开始搭建一个生产级SpringBoot2.0.X项目(二)SpringBoot应用连接数据库集成mybatis-plus
前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 连接Oracle数据库集成mybatis-plus,自定义WrapperFactory。配置代码生成器 一、引入jar包 <!--oracle驱动 --><dependency><groupId>org.springframework.boot</groupI…...
Docker部署教程:打造流畅的斗地主网页小游戏
Docker部署教程:打造流畅的斗地主网页小游戏 一、项目介绍项目简介项目预览 二、系统要求环境要求环境检查Docker版本检查检查操作系统版本 三、部署斗地主网页小游戏下载镜像创建容器检查容器状态查看容器日志安全设置 四、访问斗地主网页小游戏五、总结 一、项目介…...
redis的客户端
目录 redis的客户端一:jedis1:jedis的使用步骤:2:jedis连接池 二:springDataRedis1:入门使用2:配置序列化器3:stringRedisTemplate redis的客户端 一:jedis 1:jedis的使…...
图片分类标注工具python
图片分类标注工具 运行代码:将代码保存到 Python 文件中并运行。选择文件夹:运行时会弹出对话框,选择要分类的图片文件夹。标注分类:程序会逐张显示图片,你可以在下方输入框中输入类别标签,并点击“Next”…...
Rust命令行,实现自动反编译Android APK包工具
Rust-CLI实现自动反编译APK Rust提供了比较好的CLI接口,可以快速的编写命令行应用, 用于日常的工具类使用。 分享一个用Rust命令行实现自动反编译Android APK包工具,是之前学习Rust写的一个练手小工具,可以快速反编译APK,同时也学习下用Rust…...
10. NSTableView Table 数据表格
表格是非常重要和复杂的一个控件,本节会用大量篇幅来把表格这东西力求讲清楚。 基本设置 表格结构 表格是 OS X 组件中为数不多采用了MVC设计模式来实现的控件,即tableView–dataSource–Delegate,这种分层架构给处理数据带来了极大的便利…...
javase笔记8---File与IO流
File类型 简介 在程序中,使用java.io.File这个类来描述和操作磁盘上的一个文件或文件夹(目录)。 File这个类,能新建、删除、移动,重命名文件或文件夹,也能获取或者修改文件或文件夹的信息(如大小,修改时间等)…...
docker上传离线镜像包到Artifactory
docker上传离线镜像包到Artifactory 原创 大阳 北京晓数神州科技有限公司 2024年10月25日 17:33 北京 随着docker官方源的封禁,最近国内资源也出现无法拉取的问题,Artifactory在生产环境中,很少挂外网代理去官方源拉取,小编提供…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
