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

Qt网络编程-QTcpServer的封装

简单封装Tcp服务器类,将QTcpServer移入线程

头文件:

#ifndef TCPSERVER_H
#define TCPSERVER_H#include <QObject>class QTcpSocket;
class QTcpServer;
class QThread;
class TcpServer : public QObject {Q_OBJECT
public:explicit TcpServer(const QString &ip, quint16 port,QObject *parent = nullptr);~TcpServer();bool startListening();void stopListen();public slots:void write(const QString &ip, quint16 port, const QByteArray &data);private slots:void handleNewConnect();signals:void clientConnection(const QString &ip, quint16 port, bool connectState);void receiceSocketMessage(const QString &ip, quint16 port,const QByteArray &data);private:QString m_Ip;quint16 m_Port;QThread *m_Thread;QTcpServer *m_Server;QList<QTcpSocket *> m_Sockets;
};#endif // TCPSERVER_H

源文件:

#include "tcpserver.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>TcpServer::TcpServer(const QString &ip, quint16 port, QObject *parent): QObject(parent), m_Ip(ip), m_Port(port) {m_Server = new QTcpServer;m_Thread = new QThread;connect(m_Server, &QTcpServer::newConnection, this,&TcpServer::handleNewConnect);moveToThread(m_Thread);m_Thread->start();
}TcpServer::~TcpServer() {if (nullptr != m_Server) {if (m_Server->isListening()) stopListen();m_Server->deleteLater();m_Server = nullptr;}if (nullptr != m_Thread) {if (m_Thread->isRunning()) {m_Thread->quit();m_Thread->wait();}m_Thread->deleteLater();m_Server = nullptr;}
}bool TcpServer::startListening() {if (m_Server->isListening()) return true;return m_Server->listen(QHostAddress(m_Ip), m_Port);
}void TcpServer::stopListen() {m_Server->close();
}void TcpServer::write(const QString &ip, quint16 port, const QByteArray &data) {for (QTcpSocket *p : m_Sockets) {if (ip == p->peerAddress().toString() && port == p->peerPort()) {p->write(data);break;}}
}void TcpServer::handleNewConnect() {QTcpSocket *socket = m_Server->nextPendingConnection();QString ip = socket->peerAddress().toString();quint16 port = socket->peerPort();bool contains = false;for (QTcpSocket *p : m_Sockets) {if (ip == p->peerAddress().toString() && port == p->peerPort()) {contains = true;break;}}if (!contains) m_Sockets.append(socket);emit clientConnection(ip, port, true);connect(socket, &QTcpSocket::disconnected, [=]() {emit clientConnection(ip, port, false);for (QTcpSocket *p : m_Sockets) {if (ip == p->peerAddress().toString() && port == p->peerPort()) {m_Sockets.removeOne(p);p->deleteLater();p = nullptr;break;}}});connect(socket, &QTcpSocket::readyRead, [=]() {QByteArray data = socket->readAll();emit receiceSocketMessage(ip, port, data);});
}

调用示例:

   TcpServer *server = new TcpServer("192.168.1.3", 12345);connect(server, &TcpServer::clientConnection,[=](const QString &ip, quint16 port, bool connectState) {//TODO 处理客户端连接});connect(server, &TcpServer::receiceSocketMessage,[=](const QString &ip, quint16 port, const QByteArray &data) {处理收到客户端消息});m_Server->startListening();QByteArray data;//TODO 处理发送数据m_Server->write("192.168.1.4", 12344, data);//指定对应客户端发送数据

相关文章:

Qt网络编程-QTcpServer的封装

简单封装Tcp服务器类&#xff0c;将QTcpServer移入线程 头文件&#xff1a; #ifndef TCPSERVER_H #define TCPSERVER_H#include <QObject>class QTcpSocket; class QTcpServer; class QThread; class TcpServer : public QObject {Q_OBJECT public:explicit TcpServer(…...

【MySQL】_JDBC编程

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…...

微信小程序编译出现 project.config.json 文件内容错误

问题描述&#xff1a; 更新微信开发工具后&#xff0c;使用微信开发工具编译时出现project.config.json 文件内容错误。 原因&#xff1a;当前使用的微信开发工具非稳定版本。 解决方法&#xff1a; 在 manifest.json中加入以下代码&#xff1a; "mp-weixin" : …...

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…...

DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…...

UML之在Markdown中使用Mermaid绘制类图

1.UML概述 UML&#xff08;Unified modeling language UML&#xff09;统一建模语言&#xff0c;是一种用于软件系统分析和设计的语言工具&#xff0c;它用于帮助软件开发人员进行思考和记录思路。 类图是描述类与类之间的关系的&#xff0c;是UML图中最核心的。类图的是用于…...

Spring Boot + 七牛OSS: 简化云存储集成

引言 Spring Boot 是一个非常流行的、快速搭建应用的框架&#xff0c;它无需大量的配置即可运行起来&#xff0c;而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势&#xff0c;可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…...

C++:二叉搜索树模拟实现(KV模型)

C&#xff1a;二叉搜索树模拟实现&#xff08;KV模型&#xff09; 前言模拟实现KV模型1. 节点封装2、前置工作&#xff08;默认构造、拷贝构造、赋值重载、析构函数等&#xff09;2. 数据插入&#xff08;递归和非递归版本&#xff09;3、数据删除&#xff08;递归和非递归版本…...

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -g cnpm --regi…...

十大排序算法之线性时间非比较类排序

线性时间非比较类排序 线性时间的算法执行效率也较高&#xff0c;从时间占用上看&#xff0c;线性时间非比较类排序要优于非线性时间排序&#xff0c;但其空间复杂度较非线性时间排序要大一些。因为线性时间非比较类排序算法会额外申请一定的空间进行分配排序&#xff0c;这也…...

容器基础:Docker 镜像如何保证部署的一致性?

Docker 镜像如何通过固化基础环境、固化依赖性和固化软件启动流程保证部署的一致性 Docker 镜像通过以下三个方面保证部署的一致性&#xff1a; 1. 固化基础环境: 镜像包含构建应用程序所需的所有环境依赖项&#xff0c;例如操作系统、库和工具。构建镜像时&#xff0c;所有…...

爪哇部落算法组2024新生赛热身赛题解

第一题&#xff08;签到&#xff09;&#xff1a; 1、题意&#xff1a; 2、题解: 我们观察到happynewyear的长度是12个字符&#xff0c;我们直接从前往后遍历0到n - 12的位置&#xff08;这里索引从0开始&#xff09;&#xff0c;使用C的substr()函数找到以i开头的长度为12的字…...

1123. 铲雪车(欧拉回路)

活动 - AcWing 随着白天越来越短夜晚越来越长&#xff0c;我们不得不考虑铲雪问题了。 整个城市所有的道路都是双向车道,道路的两个方向均需要铲雪。因为城市预算的削减&#xff0c;整个城市只有 1 辆铲雪车。 铲雪车只能把它开过的地方&#xff08;车道&#xff09;的雪铲干…...

网络协议与攻击模拟_15FTP协议

了解FTP协议 在Windows操作系统上使用serv-U软件搭建FTP服务 分析FTP流量 一、FTP协议 1、FTP概念 FTP&#xff08;文件传输协议&#xff09;由两部分组成&#xff1a;客户端/服务端&#xff08;C/S架构&#xff09; 应用场景&#xff1a;企业内部存放公司文件、开发网站时利…...

「效果图渲染」效果图与3D影视动画渲染平台

效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业&#xff0c;这些领域通常对视觉呈现的精度和细节有较高要求。与之相比&#xff0c;3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域&#xff0c;…...

Blender_查看版本

Blender_查看版本 烦人的烦恼&#xff0c;没找见哪儿可以查看版本&#xff1f; 算是个隐蔽的角落&#xff01;...

node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件

请参阅&#xff1a;java : pdfbox 读取 PDF文件内书签 请注意&#xff1a;书的目录.txt 编码&#xff1a;UTF-8&#xff0c;推荐用 Notepad 转换编码。 npm install elementtree ; npm install xml2js ; node.js 用 elementtree读目录.txt文件&#xff0c;用 xml2js 转换为…...

【Docker】02 镜像管理

文章目录 一、Images镜像二、管理操作2.1 搜索镜像2.1.1 命令行搜索2.1.2 页面搜索2.1.3 搜索条件 2.2 下载镜像2.3 查看本地镜像2.3.1 docker images2.3.2 --help2.3.3 repository name2.3.4 --filter2.3.5 -q2.3.6 --format 2.4 给镜像打标签2.5 推送镜像2.6 删除镜像2.7 导出…...

了解海外云手机的多种功能

随着社会的高度发展&#xff0c;海外云手机成为商家不可或缺的工具&#xff0c;为企业出海提供了便利的解决方案。然而&#xff0c;谈及海外云手机&#xff0c;很多人仍不了解其强大功能。究竟海外云手机有哪些功能&#xff0c;可以为我们做些什么呢&#xff1f; 由于国内电商竞…...

白酒:自动化生产线的优势与实践

随着科技的进步&#xff0c;自动化生产线在各行各业的应用越来越广泛。云仓酒庄的豪迈白酒在生产过程中&#xff0c;也积极引入自动化生产线&#xff0c;以提升生产效率、品质和安全性。 首先&#xff0c;自动化生产线能够显著提高生产效率。传统的手工生产线在生产过程中容易受…...

百川2-13B-4bits量化版对比测试:OpenClaw日常任务执行效率报告

百川2-13B-4bits量化版对比测试&#xff1a;OpenClaw日常任务执行效率报告 1. 测试背景与动机 最近在折腾OpenClaw自动化工作流时&#xff0c;发现一个棘手问题&#xff1a;当任务链条较长时&#xff0c;本地部署的大模型显存占用会飙升到16GB以上&#xff0c;导致我的RTX 30…...

37 Python 时序和文本:词袋模型 BoW 和 TF-IDF 到底怎么理解?

Python 文本分析入门&#xff1a;词袋模型 BoW 和 TF-IDF 到底怎么理解&#xff1f; 上一篇主要解决了两个基础问题&#xff1a; 为什么中文文本通常要先分词&#xff1f;为什么分词之后还要做停用词过滤&#xff1f; 但文本清洗完成之后&#xff0c;新的问题很快就会出现&…...

《QGIS快速入门与应用基础》239:指北针样式选择(预设/自定义)

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

ONLYOFFICE Docs与Nextcloud Calendar集成:打造高效私有云日程协作平台

ONLYOFFICE Docs与Nextcloud Calendar集成&#xff1a;打造高效私有云日程协作平台 【免费下载链接】DocumentServer ONLYOFFICE Docs is a free collaborative online office suite comprising viewers and editors for texts, spreadsheets and presentations, forms and PDF…...

为什么操作 UI 必须加 `lcd_mutex` 互斥锁?不用会怎样?

1. 先给结论&#xff08;你必须记住&#xff09; LVGL 所有界面操作&#xff08;创建文字、按钮、刷新屏幕&#xff09;都不是线程安全的。 意思是&#xff1a; 绝对不能有两个线程同时操作 LVGL 界面&#xff01; 线程A&#xff1a;LVGL 主线程&#xff08;一直在刷新屏幕&…...

M.2 SSD硬件电路设计实战:从接口规范到高速信号布局

1. M.2 SSD硬件设计入门&#xff1a;从接口规范说起 第一次接触M.2 SSD设计时&#xff0c;我被各种接口类型和协议搞得晕头转向。现在回想起来&#xff0c;其实只要抓住几个关键点就能快速上手。M.2接口作为Intel推出的新一代存储标准&#xff0c;已经全面取代了老旧的mSATA接口…...

深度学习道路提取代码更换数据集后 PyCharm 闪退问题全面解决指南

深度学习道路提取代码更换数据集后 PyCharm 闪退问题全面解决指南 摘要 在基于深度学习的道路提取任务中,更换数据集后常出现 PyCharm 闪退现象。这类问题涉及环境配置、数据加载、内存管理、模型适配等多个层面,往往难以快速定位。本文从 Ubuntu 操作系统、PyCharm IDE、C…...

免费获取Cherry MX键帽3D模型:打造个性化机械键盘的终极指南

免费获取Cherry MX键帽3D模型&#xff1a;打造个性化机械键盘的终极指南 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 你是否厌倦了千篇一律的键盘外观&#xff1f;想要拥有独一无…...

别再只调参了!深入RepVgg设计思想,用CCFF模块优化你的模型特征融合效率

深入解析CCFF模块&#xff1a;用RepVgg思想重构跨尺度特征融合技术 在计算机视觉领域&#xff0c;特征融合一直是提升模型性能的关键环节。传统方法如FPN、PANet虽然有效&#xff0c;但在实时性要求高的场景下往往成为计算瓶颈。今天我们要探讨的CCFF&#xff08;Cross-scale C…...

League-Toolkit英雄联盟辅助工具完全指南:从配置到精通的高效使用手册

League-Toolkit英雄联盟辅助工具完全指南&#xff1a;从配置到精通的高效使用手册 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...