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

用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_serverQWebSocketServer 对象,用于监听和处理客户端连接。
    • 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&#xff1a;用于创建控制台应用的事件循环。QWebSocketServer&#xff1a;提供 …...

云原生后端:现代应用架构的核心力量

云原生后端&#xff1a;现代应用架构的核心力量 云原生后端是基于云环境进行设计和开发的一种理念&#xff0c;利用云服务和云原生技术构建的服务端应用。它旨在提供灵活、高效、弹性和可扩展的解决方案&#xff0c;成为推动应用现代化的核心力量。本文将详细探讨云原生后端的…...

arcgis中dem转模型导入3dmax

文末分享素材 效果 1、准备数据 (1)DEM (2)DOM 2、打开arcscene软件 3、加载DEM、DOM数据 4、设置DOM的高度为DEM...

Python自动化测试中的Mock与单元测试实战

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键一环。而Python作为一门灵活且强大的编程语言&#xff0c;提供了丰富的工具和库来支持自动化测试。本文将深入探讨如何结合Mock与单元测试&#xff0c;利用Python进行自动化测试&#xff0c;以提高代码的可…...

物联网海量数据下的时序数据库选型:InfluxDB、TDEngine、MongoDB与HBase对比与建议

随着物联网&#xff08;IoT&#xff09;的普及&#xff0c;各行业纷纷部署大量传感器、设备生成的数据流&#xff0c;面对如此海量的时间序列数据&#xff0c;如何高效存储、查询和分析成为关键。为此&#xff0c;时序数据库&#xff08;Time Series Database, TSDB&#xff09…...

Python中的数据可视化:Matplotlib基础与高级技巧

Python中的数据可视化&#xff1a;Matplotlib基础与高级技巧 数据可视化是数据分析和数据科学中不可或缺的一部分。通过图表&#xff0c;我们可以更直观地观察数据的分布和趋势。Matplotlib作为Python最基础、也是最广泛使用的绘图库之一&#xff0c;不仅支持多种常用图表&…...

数组名和指针数组名深度复习

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //sizeof只关注占用内存空间的大小&#xff0c;不在乎内存中存放的是什么 //是操作符 /* int main() { char arr[] { "abcdef" }; //a b c d e f \0 printf("%d\n", sizeof(arr));//…...

Linux 诞生

目录 Linux诞生背景 Linus Torvalds的创举 Linux内核的首次发布 Linux诞生背景 在计算机操作系统的发展史上&#xff0c;Linux是一个重要的里程碑。它的诞生源于对自由、开放和协作精神的追求&#xff0c;以及对Unix操作系统的深入研究和改进。 在1991年之前&#xff0c;Un…...

借助Aspose.Email,管理受密码保护的 PST 文件

在当今的数字环境中&#xff0c;保护您的数据比以往任何时候都更加重要。确保您的电子邮件数据受到密码保护是维护安全性的关键步骤。对于使用 Microsoft Outlook 数据的开发人员来说&#xff0c;管理受密码保护的 PST&#xff08;个人存储表&#xff09;文件可能是一项关键任务…...

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是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了丰富的功能和插件。以下是一些使用技巧和插件推荐&#xff1a; 使用技巧 设置中文界面&#xff1a; 打开DevEco Studio&#xff0c;选择“Configure”&#xff0c;再点击“Prefer…...

使用Node.js与Express构建RESTful API

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用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&#xff0c;自定义WrapperFactory。配置代码生成器 一、引入jar包 <!--oracle驱动 --><dependency><groupId>org.springframework.boot</groupI…...

Docker部署教程:打造流畅的斗地主网页小游戏

Docker部署教程&#xff1a;打造流畅的斗地主网页小游戏 一、项目介绍项目简介项目预览 二、系统要求环境要求环境检查Docker版本检查检查操作系统版本 三、部署斗地主网页小游戏下载镜像创建容器检查容器状态查看容器日志安全设置 四、访问斗地主网页小游戏五、总结 一、项目介…...

redis的客户端

目录 redis的客户端一&#xff1a;jedis1&#xff1a;jedis的使用步骤&#xff1a;2&#xff1a;jedis连接池 二&#xff1a;springDataRedis1:入门使用2&#xff1a;配置序列化器3&#xff1a;stringRedisTemplate redis的客户端 一&#xff1a;jedis 1&#xff1a;jedis的使…...

图片分类标注工具python

图片分类标注工具 运行代码&#xff1a;将代码保存到 Python 文件中并运行。选择文件夹&#xff1a;运行时会弹出对话框&#xff0c;选择要分类的图片文件夹。标注分类&#xff1a;程序会逐张显示图片&#xff0c;你可以在下方输入框中输入类别标签&#xff0c;并点击“Next”…...

Rust命令行,实现自动反编译Android APK包工具

Rust-CLI实现自动反编译APK Rust提供了比较好的CLI接口,可以快速的编写命令行应用, 用于日常的工具类使用。 分享一个用Rust命令行实现自动反编译Android APK包工具&#xff0c;是之前学习Rust写的一个练手小工具&#xff0c;可以快速反编译APK&#xff0c;同时也学习下用Rust…...

10. NSTableView Table 数据表格

表格是非常重要和复杂的一个控件&#xff0c;本节会用大量篇幅来把表格这东西力求讲清楚。 基本设置 表格结构 表格是 OS X 组件中为数不多采用了MVC设计模式来实现的控件&#xff0c;即tableView–dataSource–Delegate&#xff0c;这种分层架构给处理数据带来了极大的便利…...

javase笔记8---File与IO流

File类型 简介 在程序中&#xff0c;使用java.io.File这个类来描述和操作磁盘上的一个文件或文件夹(目录)。 File这个类&#xff0c;能新建、删除、移动&#xff0c;重命名文件或文件夹&#xff0c;也能获取或者修改文件或文件夹的信息(如大小&#xff0c;修改时间等)&#xf…...

docker上传离线镜像包到Artifactory

docker上传离线镜像包到Artifactory 原创 大阳 北京晓数神州科技有限公司 2024年10月25日 17:33 北京 随着docker官方源的封禁&#xff0c;最近国内资源也出现无法拉取的问题&#xff0c;Artifactory在生产环境中&#xff0c;很少挂外网代理去官方源拉取&#xff0c;小编提供…...

【专用名词的离线语音识别在2024年底的解决方法调查-会议签到的补充】

语音识别在会议点名中的使用 概要解决问题的过程不行的一些参考可以的一个package自定义词语的拼音转换遗留的问题 小结 概要 提示&#xff1a;这里可以添加技术概要 这里只实现一个方面,每个android会议设备都可通过语音发送参会者姓名,自动转换成文字添加到人员名单. 语音采集…...

OS基础-

OS基础 内存管理 内核用户设备管理 设备框架I/O子系统网络多媒体 音频视频运维 控制台GUIdebug审计计算机组成 CPU ALUregister SPLRPCR0-R12CPSRcacheclockInterrupt Vector tableIVTRMMU/MPU 内存访问权限配置&#xff0c;支持多进程BUSMEMORYI/O单线程 特点&#xff1a;结构…...

《大型语言模型实战指南:应用实践与场景落地》一文详解大型语言模型的11种微调方法

导读&#xff1a;大型预训练模型是一种在大规模语料库上预先训练的深度学习模型&#xff0c;它们可以通过在大量无标注数据上进行训练来学习通用语言表示&#xff0c;并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大&#xff0c;微调和推理阶段的资源消耗也在增加。…...

嵌入式浏览器 -- Chromium VS Firefox

嵌入式浏览器概念 嵌入式浏览器是嵌入式系统中的核心组件之一&#xff0c;用于为设备提供网络访问能力和内容显示功能。与传统PC浏览器相比&#xff0c;嵌入式浏览器更加注重性能优化和资源效率&#xff0c;同时确保核心功能可用&#xff0c;如HTML渲染、JavaScript支持和多媒…...

权限大、数量多、破坏强、管理难......企业特权访问管理怎么管?

特权账号&#xff0c;通往企业数据大门的“钥匙”。 它权限大&#xff0c;具有高危命令或操作的执行权限&#xff1b; 破坏性强&#xff0c;操作可能影响他人使用或其他系统故障&#xff1b; 信息泄露风险大&#xff0c;操作可能获取别人或其他系统相关隐私信息&#xff1b;…...

UE5 第一人称示例代码阅读0 UEnhancedInputComponent

UEnhancedInputComponent使用流程 我的总结示例分析firstthenand thenfinally&代码关于键盘输入XYZ 我的总结 这个东西是一个对输入进行控制的系统&#xff0c;看了一下第一人称例子里&#xff0c;算是看明白了&#xff0c;但是感觉这东西使用起来有点绕&#xff0c;特此梳…...

如何在Linux下安装和配置Docker

文章目录 安装前的准备在Debian/Ubuntu上安装Docker添加Docker仓库安装Docker验证安装 在CentOS/RHEL上安装Docker安装必要的软件包设置Docker仓库安装Docker启动Docker服务 Docker的基本使用拉取一个镜像运行一个容器 配置Docker创建Docker目录使用非root用户运行Docker 结语 …...

apisix的原理及作用,跟spring cloud gateway有什么区别?

apache APISIX 是一个高性能、可扩展的开源 API 网关&#xff0c;它主要用于处理 API 请求、流量管理、安全控制和服务治理。APISIX 可以将复杂的服务架构中的不同服务通过统一的网关来进行管理和监控&#xff0c;为微服务架构提供了便捷的流量入口管理方式。 APISIX 的原理 …...

华为HarmonyOS实现实时语音识别转文本

场景介绍 将一段音频信息&#xff08;短语音模式不超过60s&#xff0c;长语音模式不超过8h&#xff09;转换为文本&#xff0c;音频信息可以为pcm音频文件或者实时语音。 开发步骤 在使用语音识别时&#xff0c;将实现语音识别相关的类添加至工程。 import { speechRecogni…...

DIY可视化-uniapp悬浮菜单支持拖动、吸附-代码生成器

在Uniapp中&#xff0c;悬浮菜单支持拖动和吸附功能&#xff0c;可以为用户带来更加灵活和便捷的操作体验。以下是对这两个功能的详细解释&#xff1a; 悬浮菜单支持拖动 提高用户体验&#xff1a;用户可以根据自己的需要&#xff0c;将悬浮菜单拖动到屏幕上的任意位置&#x…...

网站建筑设计/万网域名管理入口

页面关键html代码请输入验证码看不清 checkcode()方法&#xff0c;采用ajax校验验证码var flag"true";var xmlHttp;function checkcode(){var yanzhengdocument.getElementById("yanzheng").value;xmlHttpGetXmlHttpObject()if (xmlHttpnull){alert ("…...

p2p借贷网站开发 论文/今日新闻头条新闻摘抄

单一职责代码优化第一步&#xff0c;单一职责原则 (Single Responsibility Principle)。对于一个Java类&#xff0c;应该仅有一个引起它变化的原因&#xff0c;也就是说&#xff0c;一个类中&#xff0c;应该是一组相关性很高的函数、数据的封装。但是这个原则的界限划分的并不…...

福州外贸网站制作/精准营销包括哪几个方面

《迷你世界》作为一款功能强大的沙盒游戏&#xff0c;有着高度的自由性&#xff0c;鼓励玩家们进行创造。同时也因为玩法奇特&#xff0c;有着卡通的画风&#xff0c;人物形象可爱精美&#xff0c;游戏当中的道具和方块颜色鲜艳&#xff0c;给玩家们带来了很好的游戏体验。所以…...

wordpress可以商用吗/武汉建站公司

/* ******************************************************************************************************* * * 文件名称 : gui_user.c * 版 本 : V1.0 * 作 者 : OpenRabbit * 说 明 : GUI 与 RTOS 和硬件的交互文件&#xff0c;使用时注意区分 MCU 端和模拟器…...

东莞网站建设图表/方象科技专注于什么领域

2019独角兽企业重金招聘Python工程师标准>>> win10安装配置nodejs 下载node 官网下载node接下来在命令提示符里&#xff08;winR&#xff09;输入node -v和npm -v&#xff0c;如图所示&#xff0c;表示安装完成。测试&#xff0c; 配置node 在nodejs文件目录下&a…...

做马来西亚生意的网站/网络营销招聘

第9题 1&#xff09;有三张表分别为会员表&#xff08;member&#xff09;销售表&#xff08;sale&#xff09;退货表&#xff08;regoods&#xff09; &#xff08;1&#xff09;会员表有字段memberid&#xff08;会员id&#xff0c;主键&#xff09;credits&#xff08;积分…...