Qt实现TCP调试助手 - 简述如何在Qt中实现TCP多并发
简介
- 软件开发中,可能经常会用到TCP调试工具。本人使用QT开发了一款TCP调试工具,方便大家使用。本文章主要介绍下,该工具的功能,以及如何在Qt中实现TCP服务器的并发。
界面展示
- 安装界面

- 桌面图标。安装后会生成桌面图标,双击图标可以打开程序。

- 界面展示

功能说明
- 本程序使用Qt实现了TCP客户端和服务端,服务端并发数默认为100,可配置。客户端连接后,可以在服务端看到连接的客户端信息,服务端可以指定给某一个客户端发送消息。
- 服务端不支持广播,后续版本会完善。
软件下载
- 本程序已经制作成安装包形式,下载安装后可直接使用。
- gitee下载
- CSDN资源下载
Qt实现服务端并发
- Qt实现服务端多并发时,可以实现一个类 TcpServerTools,该类需要继承于 QTcpServer,然后重写以下两个函数
- void setMaxPendingConnections(int numConnections);
- 该函数设置服务端最大连接数
- void incomingConnection(qintptr socketDescriptor);
- 当有新连接时,会触发该函数,我们需要在该函数中,将套接字保存起来。可以将套接字保存到一个Hash中 QHash<int, TcpSocketTools*>
核心源代码
-
这里只提供了服务端实现并发的核心源代码,主要有三个文件:
- networkdebugtools.cpp 为主界面文件,实现UI交互。
- tcpservertools.cpp 主要实现接受客户端连接请求,保存套接字到hash容器中。
- tcpsockettools.cpp 中主要实现处理客户端数据和断开请求。
-
三者之间可以自己定义信号槽实现通信,整体源代码不提供,请谅解。
-
networkdebugtools.h
-
#ifndef NETWORKDEBUGTOOLS_H#define NETWORKDEBUGTOOLS_H#include <QWidget>#include <QEvent>#include <QMouseEvent>#include <QMenu>#include "tcpservertools.h"#include <map>QT_BEGIN_NAMESPACEnamespace Ui { class NetworkDebugTools; }QT_END_NAMESPACEclass NetworkDebugTools : public QWidget{Q_OBJECTpublic:NetworkDebugTools(QWidget *parent = nullptr);~NetworkDebugTools();private slots:void on_pushButton_send_clicked();void on_pushButton_listen_clicked();private:Ui::NetworkDebugTools *ui;TcpServerTools *mTcpServerTools;};#endif // NETWORKDEBUGTOOLS_H -
networkdebugtools.cpp
-
#include "networkdebugtools.h"#include "ui_networkdebugtools.h"#include <QMessageBox>#include <QHostInfo>#include <QTableWidgetItem>NetworkDebugTools::NetworkDebugTools(QWidget *parent): QWidget(parent), ui(new Ui::NetworkDebugTools){ui->setupUi(this);mTcpServerTools = new TcpServerTools();}void NetworkDebugTools::on_pushButton_send_clicked(){//获取当前选中的客户端信息QString curAddr = ui->tableWidget_clientInfo->item(curRow, 0)->text();QHash<int, TcpSocketTools*>::iterator iter = mTcpServerTools->tcpClient->begin();for (; iter != mTcpServerTools->tcpClient->end(); iter++) {QString iterAddr = iter.value()->peerAddress().toString() + ":" + QString::number(iter.value()->peerPort());if (iterAddr.compare(curAddr) == 0) {//这里hash容器tcpClient中保存的value就是socket,可以直接通过socket给客户端发送数据//同样可以通过该socket获取客户端的ip和端口,然后与我们点击的客户端信息比对,就可以实现对指定客户端发送消息iter.value()->write(ui->plainTextEdit_send->toPlainText().toLocal8Bit());break;}}}void NetworkDebugTools::on_pushButton_listen_clicked(){if (ui->pushButton_listen->text().compare("监听") == 0) {ui->pushButton_listen->setText("关闭");mTcpServerTools->setMaxPendingConnections(mConfigTools->getConnCount());mTcpServerTools->startListen();}else {ui->pushButton_listen->setText("监听");mTcpServerTools->closeConnect();}} -
tcpservertools.h
-
#ifndef TCPSERVERTOOLS_H#define TCPSERVERTOOLS_H#include <QWidget>#include <QTcpServer>#include <QHostInfo>#include <QAbstractSocket>#include <QTcpSocket>#include "tcpsockettools.h"#define THREAD_MAX 20class TcpServerTools : public QTcpServer{Q_OBJECTpublic:explicit TcpServerTools(QTcpServer *parent = 0);~TcpServerTools();//开始监听bool startListen();//关闭连接void closeConnect();//设置最大连接数void setMaxPendingConnections(int numConnections);protected:// 有新连接到来时,该函数会被触发void incomingConnection(qintptr socketDescriptor);private:QTcpServer *mTcpServer; //tcp服务对象public:QHash<int, TcpSocketTools*> *tcpClient;// 该对象中保存套接字};#endif // TCPSERVERTOOLS_H -
tcpservertools.cpp
-
#include "tcpservertools.h"TcpServerTools::TcpServerTools(QTcpServer *parent) : QTcpServer(parent){tcpClient = new QHash<int, TcpSocketTools*>;}TcpServerTools::~TcpServerTools(){}bool TcpServerTools::startListen() {//监听连接this->listen(QHostAddress(mIp), mPort.toInt());return true;}void TcpServerTools::closeConnect(){// 断开连接时,删除tcpClient中保存的套接字,并清除 tcpClientQHash<int, TcpSocketTools*>::const_iterator iterC = tcpClient->constBegin();for (; iterC != tcpClient->constEnd(); iterC++){iterC.value()->deleteLater();}tcpClient->clear();this->close();}void TcpServerTools::incomingConnection(qintptr socketDescriptor) {//创建 TcpSocketTools 对象TcpSocketTools *socketTools = new TcpSocketTools(socketDescriptor); QString connAddr = socketTools->peerAddress().toString() + ":" + QString::number(socketTools->peerPort());// 有新连接时,保存socket到 QHash<int, TcpSocketTools*> 类型的tcpClient指针对象中tcpClient->insert(socketDescriptor, socketTools);}// 设置最大连接数void TcpServerTools::setMaxPendingConnections(int numConnections) {QTcpServer::setMaxPendingConnections(numConnections);} -
tcpsockettools.h
-
#ifndef TCPSOCKETTOOLS_H#define TCPSOCKETTOOLS_H#include <QTcpSocket>class TcpSocketTools : public QTcpSocket{Q_OBJECTpublic:explicit TcpSocketTools(qintptr socketDescriptor, QTcpSocket *parent = 0);~TcpSocketTools();public slots :void onReadyRead();void onDisconnected();private:qintptr socketID;};#endif // TCPSOCKETTOOLS_H -
tcpsockettools.cpp
-
#include "tcpsockettools.h"#include <QHostAddress>TcpSocketTools::TcpSocketTools(qintptr socketDescriptor, QTcpSocket *parent) : QTcpSocket(parent),socketID(socketDescriptor){this->setSocketDescriptor(socketDescriptor);connect(this, &TcpSocketTools::readyRead, this, &TcpSocketTools::onReadyRead);connect(this, &TcpSocketTools::disconnected, this, &TcpSocketTools::onDisconnected);}TcpSocketTools::~TcpSocketTools(){}void TcpSocketTools::onReadyRead() {//处理接受到的数据} void TcpSocketTools::onDisconnected() {//处理断开连接请求}
相关文章:
Qt实现TCP调试助手 - 简述如何在Qt中实现TCP多并发
简介 软件开发中,可能经常会用到TCP调试工具。本人使用QT开发了一款TCP调试工具,方便大家使用。本文章主要介绍下,该工具的功能,以及如何在Qt中实现TCP服务器的并发。 界面展示 安装界面 桌面图标。安装后会生成桌面图标&#…...
【Python OpenCV】OpenCV介绍
文章目录 前言一、OpenCV简介二、基本功能三、实际应用场景四、Python安装OpenCV总结 前言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和图像处理库,它提供了丰富的工具和函数,用于处理图像和视频。由于…...
11-09 周四 CNN 卷积神经网络基础知识
11-09 周四 CNN 卷积神经网络 时间版本修改人描述2023年11月9日09:38:12V0.1宋全恒新建文档 简介 学习一下CNN,卷积神经网络。使用的视频课程。视觉相关的任务: 人脸识别 卷积网络与传统网络的区别: <img altimage-20231109094400591 s…...
Vue.js中的路由(router)和Vue Router的作用?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
从开源项目聊鱼眼相机的“360全景拼接”
目录 概述 从360全景的背景讲起 跨过参数标定聊透视变化 拼接图片后处理 参考文献 概述 写这篇文章的原因完全源于开源项目(GitHub参阅参考文献1)。该项目涵盖了环视系统的较为全貌的制作过程,包含完整的标定、投影、拼接和实时运行流程。该篇文章主要是梳理全…...
网络安全——
文章目录 网络安全TCP/IP与网络安全网络安全构成要素加密技术基础 网络安全 TCP/IP与网络安全 起初,TCP/IP只用于一个相对封闭的环境,之后才发展为并无太多限制、可以从远程访问更多资源的形式。因此,“安全”这个概念并没有引起人们太多的…...
用excel 整理工作流程,以周为时间节点,自动统计进度
无论是处理自己还是团队的工作,我们都经常会遇到复杂的,凌乱的,需要多个环节才能完成的工作。 梳理工作流程 因为环节内容,每个环节处理不当都可能会导致我们整个工作目标实现受到影响,所以通过工作流程图,…...
Wireshark学习 与 TCP/IP协议分析
Wireshark简介和工具应用 如何开始抓包? 打开wireshark,显示如下网络连接。选择你正在使用的,(比如我正在使用无线网上网),双击 可以先看下自己的ip地址和网关ip地址(看抓包数据时候会用到&…...
Sequence(矩阵连乘+数论)
求Fn mod 1e97 Input 第一行是一个t代表有t组数据 接下来有t行每行有6个整数A,B,C,D,P,n 1<t<10 0<A,B,C,D<1e9 1<p,n<1e9 Output 输出一个答案Fn对1e97取余 Sample Input 2 1 1 1 1 1 5 1 1 1 1 10 4 Sample Output 9 10 思路: p/n上…...
集合工具类的常用方法--小总和
前言 集合工具类是Java中的一个重要工具类,在Java常用的集合框架中起到了重要的作用。集合工具类提供了一系列的方法,可以方便地处理Java中的集合对象,提高了开发的效率。 Collections类 Collections.sort(List<T> list) 对List集合进…...
一文了解游戏行业(数据分析)
一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发,发行和销售等环节 ①游戏开发 上游环节是游戏产业链的核心环节,包括游戏策划,美术设计,程序开发等,是决定游戏质量与内容的关键因…...
Flutter之Json序列化
前言 使用 json_annotation 框架实现json字符串序列化和反序列化 框架官方地址:json_serializable 一、引入依赖:在pubspec.yaml中添加 dependencies:json_annotation: ^4.8.1dev_dependencies:build_runner: ^2.3.3json_serializable: ^6.6.0 二、…...
Java基础——局部变量和常量
变量:内存中的一个存储区域(该区域的数据可以在同一类型范围内不断变化)。 常量:一旦声明就不可变,通常用 final 修饰的变量称为常量。 声明格式: [final] 变量类型 变量名;说明: final修饰…...
番外 1 : Java 环境下的 selenium 搭建
Java 环境下的 selenium 搭建 一 . 下载谷歌浏览器二 . 下载谷歌浏览器驱动2.1 查看谷歌浏览器版本2.2 下载对应版本的谷歌驱动2.3 解压下载好的驱动压缩包 , 将下载好的 chromedriver.exe 放到java 系统环境变量下 三 . 下载 Edge 浏览器的驱动3.1 查看 Edge 浏览器的版本3.2 …...
游戏缺失d3dx9_39.dll的5个修复方法,深度解析d3dx9_39.dll文件的作用
在当今的数字化时代,电子游戏已经成为了人们休闲娱乐的重要方式之一。然而,对于许多玩家来说,他们在享受游戏带来的乐趣的同时,也可能会遇到各种各样的问题,其中最常见的就是游戏无法正常运行。而这些问题中࿰…...
RHCSA --- Linux用户/组权限
用户管理 useradd 创建用户 -u(UID) 指定UID -g(GID) 指定基本组 -G(GID1,GID2,...) 指定附加组 -c “注释信息” 指定用户注释信息(昵称) -d /path…...
怎么做到高性能网络IO?
为什么要做高性能网络IO。主要是解决c10,c10M问题 最开始的时候我们走的内核协议栈,走内核协议栈其实性能比较低,因为我们之前介绍的时候需要拷贝两次 但是我们采用用户态协议栈可以少拷贝一次,可以大大提高效率, 步骤…...
设计模式-创建型
文章目录 设计模式-创建型工厂模式简单工厂工厂方法抽象工厂 建造者模式单例模式原型模式 设计模式-创建型 本章主要介绍有关对象创建的几种设计模式。 工厂模式 工厂模式:封装了对象的创建,使得获得对象更加符合实际逻辑 简单工厂 将所有对象的生产…...
Word通过Adobe打印PDF时总是报错,打开记事本
Word文档打印,选择Adobe作为打印机,打印过程中总是报错,不断打开记事本,提示打印出错,错误信息如下: %%[ ProductName: Distiller ]%% %%[Page: 1]%% %%[Page: 2]%% %%[ Error: invalidfont; OffendingCom…...
第2关:还原键盘输入(list)
题目: 知识点: 列表list相较于数组: 优势:可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势:无法直接进行下标索引,需要迭代器it逐个遍历。 代码: #include <iostream>…...
MIKEURBAN几种错误解决方法
今天小编给大家总结关于MIKEURBAN计算中常见的几种错误吧!错误一MIKE URBAN出现以上的错误时候,我们按照错误提示找出错误点的编号,此时的错误点是由于没有和汇水区做链接导致,重新手动做链接即可解决。错误二MIKE URBAN出现以上的…...
魔兽争霸III运行卡顿、画面变形?WarcraftHelper开源工具助你解决经典游戏兼容难题
魔兽争霸III运行卡顿、画面变形?WarcraftHelper开源工具助你解决经典游戏兼容难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 经典游戏…...
Matlab新手也能搞定的MFAC仿真:从侯忠生教授书上的例题4.1代码跑通说起
Matlab新手也能搞定的MFAC仿真:从侯忠生教授书上的例题4.1代码跑通说起 第一次接触无模型自适应控制(MFAC)时,很多人会被各种理论推导吓退。但作为工程师,我们更关心的是如何让代码跑起来,看到实际效果。本…...
避开这3个坑!用MateChat对接企业私有模型的实战经验分享
避开这3个坑!用MateChat对接企业私有模型的实战经验分享 当企业决定将AI能力深度整合到CRM系统时,数据安全和系统稳定性往往成为技术负责人最头疼的问题。去年我们为某跨国零售集团部署MateChat私有化方案时,曾因Ollama服务崩溃导致整个销售团…...
从VINS-Mono移植到ROS2受阻?手把手教你用源码在Ubuntu 22.04搭建ROS Noetic测试环境
在Ubuntu 22.04上源码构建ROS Noetic环境的完整指南 当算法工程师尝试将VINS-Mono从ROS迁移到ROS2时,经常会遇到各种兼容性问题。这时候,拥有一个原生的ROS Noetic环境进行对照测试就显得尤为重要。本文将详细介绍如何在Ubuntu 22.04上通过源码构建完整的…...
直通大厂:腾讯二面高频考题,多Agent工作原理超详细拆解!
1. 题目分析 一个 Agent 能做的事情终归有限。当你试图让单个 Agent 去完成一个真正复杂的任务——比如从零开始做一次完整的市场调研并输出 PPT 报告——你会发现它要么因为上下文窗口塞满而"失忆",要么因为角色定位太泛而每一步都做得半吊子。这就像让…...
Comsol仿真:周期性结构多级分解的奇妙之旅
comsol仿真计算周期性结构的多级分解,与论文结果几乎一致最近在搞周期性结构的研究,其中多级分解这一块可真是费了我不少脑细胞。好在有Comsol仿真这个强大的工具,帮我把理论上复杂的多级分解问题,转化为直观的仿真结果࿰…...
自动化测试面试中常见的问题
一、测试用例再执行点击元素时失败,导致整个测试用例失败。如何提高点击元素的成功率?解决办法:selenium是在点击元素时是通过元素定位的方式找到元素的,要提高点击的成功率,必须保证找到元素的定位方式准确。但是在自动化工程的…...
WeReader:革新微信读书体验的高效笔记管理工具
WeReader:革新微信读书体验的高效笔记管理工具 【免费下载链接】wereader 一个浏览器扩展:主要用于微信读书做笔记,对常使用 Markdown 做笔记的读者比较有帮助。 项目地址: https://gitcode.com/gh_mirrors/wer/wereader 你是否曾为微…...
Go语言SQL构建器goqu与标准库sql对比:为什么选择SQL构建器的完整指南
Go语言SQL构建器goqu与标准库sql对比:为什么选择SQL构建器的完整指南 【免费下载链接】goqu SQL builder and query library for golang 项目地址: https://gitcode.com/gh_mirrors/go/goqu 在Go语言开发中,数据库操作是每个后端开发者必须面对的…...
