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服务器类,将QTcpServer移入线程 头文件: #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 文件内容错误
问题描述: 更新微信开发工具后,使用微信开发工具编译时出现project.config.json 文件内容错误。 原因:当前使用的微信开发工具非稳定版本。 解决方法: 在 manifest.json中加入以下代码: "mp-weixin" : …...
一周学会Django5 Python Web开发-Django5创建项目(用命令方式)
锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…...
DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器
文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…...
UML之在Markdown中使用Mermaid绘制类图
1.UML概述 UML(Unified modeling language UML)统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路。 类图是描述类与类之间的关系的,是UML图中最核心的。类图的是用于…...
Spring Boot + 七牛OSS: 简化云存储集成
引言 Spring Boot 是一个非常流行的、快速搭建应用的框架,它无需大量的配置即可运行起来,而七牛云OSS提供了稳定高效的云端对象存储服务。利用两者的优势,可以为应用提供强大的文件存储功能。 为什么选择七牛云OSS? 七牛云OSS提供了高速的…...
C++:二叉搜索树模拟实现(KV模型)
C:二叉搜索树模拟实现(KV模型) 前言模拟实现KV模型1. 节点封装2、前置工作(默认构造、拷贝构造、赋值重载、析构函数等)2. 数据插入(递归和非递归版本)3、数据删除(递归和非递归版本…...
npm淘宝镜像源换新地址
新的淘宝npm镜像源地址:https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的,则直接安装 npm install -g cnpm --regi…...
十大排序算法之线性时间非比较类排序
线性时间非比较类排序 线性时间的算法执行效率也较高,从时间占用上看,线性时间非比较类排序要优于非线性时间排序,但其空间复杂度较非线性时间排序要大一些。因为线性时间非比较类排序算法会额外申请一定的空间进行分配排序,这也…...
容器基础:Docker 镜像如何保证部署的一致性?
Docker 镜像如何通过固化基础环境、固化依赖性和固化软件启动流程保证部署的一致性 Docker 镜像通过以下三个方面保证部署的一致性: 1. 固化基础环境: 镜像包含构建应用程序所需的所有环境依赖项,例如操作系统、库和工具。构建镜像时,所有…...
爪哇部落算法组2024新生赛热身赛题解
第一题(签到): 1、题意: 2、题解: 我们观察到happynewyear的长度是12个字符,我们直接从前往后遍历0到n - 12的位置(这里索引从0开始),使用C的substr()函数找到以i开头的长度为12的字…...
1123. 铲雪车(欧拉回路)
活动 - AcWing 随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。 整个城市所有的道路都是双向车道,道路的两个方向均需要铲雪。因为城市预算的削减,整个城市只有 1 辆铲雪车。 铲雪车只能把它开过的地方(车道)的雪铲干…...
网络协议与攻击模拟_15FTP协议
了解FTP协议 在Windows操作系统上使用serv-U软件搭建FTP服务 分析FTP流量 一、FTP协议 1、FTP概念 FTP(文件传输协议)由两部分组成:客户端/服务端(C/S架构) 应用场景:企业内部存放公司文件、开发网站时利…...
「效果图渲染」效果图与3D影视动画渲染平台
效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业,这些领域通常对视觉呈现的精度和细节有较高要求。与之相比,3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域,…...
Blender_查看版本
Blender_查看版本 烦人的烦恼,没找见哪儿可以查看版本? 算是个隐蔽的角落!...
node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件
请参阅:java : pdfbox 读取 PDF文件内书签 请注意:书的目录.txt 编码:UTF-8,推荐用 Notepad 转换编码。 npm install elementtree ; npm install xml2js ; node.js 用 elementtree读目录.txt文件,用 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 导出…...
了解海外云手机的多种功能
随着社会的高度发展,海外云手机成为商家不可或缺的工具,为企业出海提供了便利的解决方案。然而,谈及海外云手机,很多人仍不了解其强大功能。究竟海外云手机有哪些功能,可以为我们做些什么呢? 由于国内电商竞…...
白酒:自动化生产线的优势与实践
随着科技的进步,自动化生产线在各行各业的应用越来越广泛。云仓酒庄的豪迈白酒在生产过程中,也积极引入自动化生产线,以提升生产效率、品质和安全性。 首先,自动化生产线能够显著提高生产效率。传统的手工生产线在生产过程中容易受…...
Mysql是怎么加锁的?
原文地址https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E4%BB%80%E4%B9%88-sql-%E8%AF%AD%E5%8F%A5%E4%BC%9A%E5%8A%A0%E8%A1%8C%E7%BA%A7%E9%94%81 我只是精简一下做个记录 这篇汇总将基于 MySQL 8.0 的 InnoDB 引擎,在 可重复读(Repe…...
别再手动算内存了!用STM32CubeIDE的Build Analyzer,5分钟摸清你的H743芯片还剩多少FLASH和RAM
深度解析STM32CubeIDE内存分析:从Build Analyzer到高效内存管理实战 在嵌入式开发的世界里,内存就像是一块珍贵的画布——有限且昂贵。想象一下,当你精心设计的STM32H743程序在关键时刻崩溃,而问题可能仅仅是因为某个全局变量悄悄…...
别再为IP冲突头疼!YOLOv5+海康威视摄像头组网与实时检测的完整避坑指南
工业视觉组网实战:YOLOv5与海康威视摄像头的智能协同方案 在智能制造与安防监控领域,将AI算法与专业摄像设备结合已成为技术标配。但当工程师真正着手部署时,往往会陷入网络配置的泥潭——IP冲突导致设备失联、RTSP流媒体断断续续、多网卡环…...
如何快速搭建QQ机器人?LuckyLilliaBot入门指南
如何快速搭建QQ机器人?LuckyLilliaBot入门指南 【免费下载链接】LuckyLilliaBot NTQQ的OneBot API插件 项目地址: https://gitcode.com/gh_mirrors/li/LuckyLilliaBot 在数字化时代,QQ机器人开发已成为自动化交互的重要工具。LuckyLilliaBot作为N…...
Go Mutex 与 RWMutex 性能对比
在Go语言并发编程中,Mutex(互斥锁)和RWMutex(读写锁)是两种常用的同步机制。它们的性能差异直接影响高并发场景下的程序效率。本文将从多个角度对比两者的性能表现,帮助开发者根据实际需求选择合适的锁机制…...
ROS Noetic + RealSense D435i:从驱动安装到RVIZ点云显示的完整工作流解析
ROS Noetic RealSense D435i:从驱动安装到RVIZ点云显示的完整工作流解析 在机器人视觉项目的初期搭建阶段,开发者往往面临一个关键挑战:如何将深度相机从"硬件连接"快速推进到"可用数据流"状态。以Intel RealSense D435…...
Uvicorn性能调优:异步I/O模型选择与配置指南
Uvicorn性能调优:异步I/O模型选择与配置指南 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn作为Python生态中最受欢迎的ASGI服务器,其性能表现直接…...
低成本自动化方案:OpenClaw+Qwen3-32B替代SaaS API调用实测
低成本自动化方案:OpenClawQwen3-32B替代SaaS API调用实测 1. 为什么选择本地AI自动化方案 去年我在处理海外客户邮件时,每月需要支付近200美元的SaaS服务费。这些费用主要消耗在邮件分类、摘要生成和自动回复等基础功能上。当我发现OpenClaw框架可以对…...
5步打造企业级数字人创作平台:从本地化部署到场景落地全指南
5步打造企业级数字人创作平台:从本地化部署到场景落地全指南 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 一、价值定位:数字人技术的企业级应用价值 核心价值:Duix.Avatar通过全本…...
ICML 2023亚马逊论文速览:自适应计算与差分隐私
机器学习 某机构在ICML 2023会议论文速览 在一系列主题中,某机构的研究融合了理论与实践的探索。 会议 ICML 2023 在今年的国际机器学习大会(ICML)上,某机构的研究人员发表了多篇关于赌博机问题和差分隐私的论文,这两个…...
