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

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多并发

简介 软件开发中&#xff0c;可能经常会用到TCP调试工具。本人使用QT开发了一款TCP调试工具&#xff0c;方便大家使用。本文章主要介绍下&#xff0c;该工具的功能&#xff0c;以及如何在Qt中实现TCP服务器的并发。 界面展示 安装界面 桌面图标。安装后会生成桌面图标&#…...

【Python OpenCV】OpenCV介绍

文章目录 前言一、OpenCV简介二、基本功能三、实际应用场景四、Python安装OpenCV总结 前言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和图像处理库&#xff0c;它提供了丰富的工具和函数&#xff0c;用于处理图像和视频。由于…...

11-09 周四 CNN 卷积神经网络基础知识

11-09 周四 CNN 卷积神经网络 时间版本修改人描述2023年11月9日09:38:12V0.1宋全恒新建文档 简介 学习一下CNN&#xff0c;卷积神经网络。使用的视频课程。视觉相关的任务&#xff1a; 人脸识别 卷积网络与传统网络的区别&#xff1a; <img altimage-20231109094400591 s…...

Vue.js中的路由(router)和Vue Router的作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

从开源项目聊鱼眼相机的“360全景拼接”

目录 概述 从360全景的背景讲起 跨过参数标定聊透视变化 拼接图片后处理 参考文献 概述 写这篇文章的原因完全源于开源项目(GitHub参阅参考文献1)。该项目涵盖了环视系统的较为全貌的制作过程&#xff0c;包含完整的标定、投影、拼接和实时运行流程。该篇文章主要是梳理全…...

网络安全——

文章目录 网络安全TCP/IP与网络安全网络安全构成要素加密技术基础 网络安全 TCP/IP与网络安全 起初&#xff0c;TCP/IP只用于一个相对封闭的环境&#xff0c;之后才发展为并无太多限制、可以从远程访问更多资源的形式。因此&#xff0c;“安全”这个概念并没有引起人们太多的…...

用excel 整理工作流程,以周为时间节点,自动统计进度

无论是处理自己还是团队的工作&#xff0c;我们都经常会遇到复杂的&#xff0c;凌乱的&#xff0c;需要多个环节才能完成的工作。 梳理工作流程 因为环节内容&#xff0c;每个环节处理不当都可能会导致我们整个工作目标实现受到影响&#xff0c;所以通过工作流程图&#xff0c…...

Wireshark学习 与 TCP/IP协议分析

Wireshark简介和工具应用 如何开始抓包&#xff1f; 打开wireshark&#xff0c;显示如下网络连接。选择你正在使用的&#xff0c;&#xff08;比如我正在使用无线网上网&#xff09;&#xff0c;双击 可以先看下自己的ip地址和网关ip地址&#xff08;看抓包数据时候会用到&…...

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 思路&#xff1a; p/n上…...

集合工具类的常用方法--小总和

前言 集合工具类是Java中的一个重要工具类&#xff0c;在Java常用的集合框架中起到了重要的作用。集合工具类提供了一系列的方法&#xff0c;可以方便地处理Java中的集合对象&#xff0c;提高了开发的效率。 Collections类 Collections.sort(List<T> list) 对List集合进…...

一文了解游戏行业(数据分析)

一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发&#xff0c;发行和销售等环节 ①游戏开发 上游环节是游戏产业链的核心环节&#xff0c;包括游戏策划&#xff0c;美术设计&#xff0c;程序开发等&#xff0c;是决定游戏质量与内容的关键因…...

Flutter之Json序列化

前言 使用 json_annotation 框架实现json字符串序列化和反序列化 框架官方地址&#xff1a;json_serializable 一、引入依赖&#xff1a;在pubspec.yaml中添加 dependencies:json_annotation: ^4.8.1dev_dependencies:build_runner: ^2.3.3json_serializable: ^6.6.0 二、…...

Java基础——局部变量和常量

变量&#xff1a;内存中的一个存储区域&#xff08;该区域的数据可以在同一类型范围内不断变化&#xff09;。 常量&#xff1a;一旦声明就不可变&#xff0c;通常用 final 修饰的变量称为常量。 声明格式&#xff1a; [final] 变量类型 变量名;说明&#xff1a; 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文件的作用

在当今的数字化时代&#xff0c;电子游戏已经成为了人们休闲娱乐的重要方式之一。然而&#xff0c;对于许多玩家来说&#xff0c;他们在享受游戏带来的乐趣的同时&#xff0c;也可能会遇到各种各样的问题&#xff0c;其中最常见的就是游戏无法正常运行。而这些问题中&#xff0…...

RHCSA --- Linux用户/组权限

用户管理 useradd 创建用户 -u&#xff08;UID&#xff09; 指定UID -g&#xff08;GID&#xff09; 指定基本组 -G&#xff08;GID1,GID2,...) 指定附加组 -c “注释信息” 指定用户注释信息&#xff08;昵称&#xff09; -d /path…...

怎么做到高性能网络IO?

为什么要做高性能网络IO。主要是解决c10&#xff0c;c10M问题 最开始的时候我们走的内核协议栈&#xff0c;走内核协议栈其实性能比较低&#xff0c;因为我们之前介绍的时候需要拷贝两次 但是我们采用用户态协议栈可以少拷贝一次&#xff0c;可以大大提高效率&#xff0c; 步骤…...

设计模式-创建型

文章目录 设计模式-创建型工厂模式简单工厂工厂方法抽象工厂 建造者模式单例模式原型模式 设计模式-创建型 本章主要介绍有关对象创建的几种设计模式。 工厂模式 工厂模式&#xff1a;封装了对象的创建&#xff0c;使得获得对象更加符合实际逻辑 简单工厂 将所有对象的生产…...

Word通过Adobe打印PDF时总是报错,打开记事本

Word文档打印&#xff0c;选择Adobe作为打印机&#xff0c;打印过程中总是报错&#xff0c;不断打开记事本&#xff0c;提示打印出错&#xff0c;错误信息如下&#xff1a; %%[ ProductName: Distiller ]%% %%[Page: 1]%% %%[Page: 2]%% %%[ Error: invalidfont; OffendingCom…...

第2关:还原键盘输入(list)

题目&#xff1a; 知识点&#xff1a; 列表list相较于数组&#xff1a; 优势&#xff1a;可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势&#xff1a;无法直接进行下标索引&#xff0c;需要迭代器it逐个遍历。 代码&#xff1a; #include <iostream>…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...