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

Qt项目——Tcp网络调试助手服务端与客户端

目录

  • 前言
  • 结果预览
  • 工程文件源代码
  • 一、开发流程
  • 二、Tcp协议
  • 三、Socket
  • 四、Tcp服务器的关键流程
  • 五、Tcp客户端的关键流程
  • 六、Tcp服务端核心代码
  • 七、客户端核心代码
  • 总结

前言

这期要运用到计算机网络的知识,要搞清楚Tcp协议,学习QTcpServer
,学习QTcpClient,学习TextEdit特定位置输入文字颜色学习网络通信相关知识点,复习巩固之前UI控件。

在这里插入图片描述

结果预览

在这里插入图片描述

在这里插入图片描述

工程文件源代码

我把文档放在gitCode上

https://gitcode.com/ycs66/Qtproject-Tcp
在这里插入图片描述

一、开发流程

在这里插入图片描述

二、Tcp协议

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,旨在为不可靠的IP网络提供端到端的可靠数据传输服务。

核心特点与功能
​​1.可靠性保障​​
TCP通过​​确认应答(ACK)机制​​、​​超时重传​​、​​数据校验和​​以及​​序列号排序​​确保数据完整性和顺序性。发送方为每个数据包分配唯一序列号,接收方通过确认序号反馈接收状态,若未收到应答则触发重传。此外,校验和机制可检测传输错误并丢弃异常数据包。
2.​​流量控制​​
采用​​滑动窗口协议​​动态调整发送速率,防止接收方缓冲区溢出。通过窗口大小字段告知发送方可接收的数据量,实现高效的双向流量管理。
​​3.拥塞控制​​
通过​​慢启动​​、​​拥塞避免​​和​​快速恢复​​等算法(如AIMD算法)动态适应网络状况。例如,连接初期以指数增长探测带宽,出现丢包时线性调整速率,避免网络拥塞。
​​4.连接管理​​
通过​​三次握手​​建立连接(SYN、SYN-ACK、ACK交换)和​​四次挥手​​终止连接(FIN、ACK交互),确保通信双方状态同步。例如,三次握手防止历史连接干扰,四次挥手支持半关闭状态处理未完成数据传输。
5.​​面向字节流的传输​​
将应用层数据分割为适当长度的报文段(通常受MTU限制),重组后按顺序交付,形成连续的字节流,屏蔽底层数据包的离散性。

与UDP的对比
TCP强调可靠性,适用于文件传输(如FTP)、网页访问(HTTP)等场景;而UDP无连接、不保证可靠性,但传输效率高,常用于实时音视频或DNS查询等对延迟敏感的场景。

三、Socket

Socket 不是一个协议,而是一种编程接口(API)或机制,用于在网络中实现通信。Socket 通常在应用层和传输层之间提供一个端点,使得应用程序可以通过网络发送和接收数据。它支持多种协议,主要是TCP 和 UDP。
总之,Socket 是实现网络通信的基础工具之一,它抽象化了网络层的复杂性,为开发者提供了一种相对简单的方式来建立和管理网络连接。

四、Tcp服务器的关键流程

工程建立,需要在.pro加入网络权限
在这里插入图片描述
创建一个基于 QTcpServer 的服务端涉及以下关键步骤:

  1. 创建并初始化 QTcpServer 实例:
    实例化 QTcpServer 。
    调用 listen 方法在特定端口监听传入的连接。
  2. 处理新连接:
    为 newConnection 信号连接一个槽函数。
    在槽函数中,使用 nextPendingConnection 获取 QTcpSocket 以与客户端通信。
  3. 读取和发送数据:
    通过连接 QTcpSocket 的 readyRead 信号来读取来自客户端的数据。
    使用 write 方法发送数据回客户端。
  4. 关闭连接:
    在适当的时候关闭 QTcpSocket 。

五、Tcp客户端的关键流程

这个也要在.pro文件加上网络权限,操作与服务端相同。
创建一个基于:acpsocket 的Qt客户端涉及以下步骤:
1.创建 QTcpsocket 实例:
实例化 QTcpsocket
2.连接到服务器
使用connectToHost:方法连接到服务器的IP地址和端口。
3.发送数据到服务器
使用 write方法发送数据
4.接收来自服务器的数据!
为:readykead 信号连接一个槽函数来接收数据,
5.关闭连接
关闭QTcpsocket链接

六、Tcp服务端核心代码

主要步骤如下:
1.创建 qTcpserver实例:启动服务器并开始监听指定端口。
2.监听连接请求:调用 listen()方法使服务器监听特定的 IP 地址和端口。
3.接受连接:当客户端尝试连接时,QTcpserver 产生一个信号。你需要实现一个槽(slot)来响应这个信号,并接受连接。
4.处理客户端连接:每个连接的客户端都关联一个QTcpsocket 对象,用于数据交换。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setLayout(ui->verticalLayout);server = new QTcpServer(this);connect(server, SIGNAL(newConnection()),this,SLOT(on_newClient_connect()));connect(ui->comboBoxChlidren,&MyComboBox::on_ComboBox_clicked,this,&Widget::mComboBox_reflesh);ui->btnStopListen->setEnabled(false);ui->btnLineOut->setEnabled(false);ui->btnSend->setEnabled(false);QList<QHostAddress> address = QNetworkInterface::allAddresses();//存储所有地址for(QHostAddress tmp : address){if(tmp.protocol() == QAbstractSocket::IPv4Protocol){ui->comboBoxAddr->addItem(tmp.toString());}}}void Widget::on_newClient_connect()
{if(server->hasPendingConnections()){QTcpSocket* connection = server->nextPendingConnection();qDebug() << "client Addr: " << connection->peerAddress().toString() << "client Port: " << connection->peerPort();//客户端信息ui->textEditRev->insertPlainText("客户端地址: " + connection->peerAddress().toString() +"  客户端端口号: " + QString::number(connection->peerPort()) + "\n");connect(connection,SIGNAL(readyRead()),this,SLOT(on_readyread_handler()));//读取客户端发送的信息//connect(connection,SIGNAL(disconnected()),this,SLOT(mdisconnected()));//客户端断开链接信号和槽connect(connection,SIGNAL(stateChanged(QAbstractSocket::SocketState )),this,SLOT(mstateChanged(QAbstractSocket::SocketState )));ui->comboBoxChlidren->addItem(QString::number(connection->peerPort()));ui->comboBoxChlidren->setCurrentText(QString::number(connection->peerPort()));if(!ui->btnSend->isEnabled()){ui->btnSend->setEnabled(true);}}}

七、客户端核心代码

1.创建 Tcpc1ient 类:这个类继承自 qobject ,允许使用信号与槽机制。
2.连接信号和槽:在构造函数中,将 QTcpsocket 的 connected 和 readyRead 信号分别连接到
onconnected 和:onReadyRead槽。
3.连接到服务器:使用 connectToHost()方法开始连接过程。
4.处理连接建立:一旦连接建立,onconnected 槽被触发,客户端向服务器发送一条消息.。
5.接收数据:当数据可读时,onReadyRead 槽被触发,客户端读取并打印来自服务器的数据
6.断开连接:在接收数据后,客户端断开与服务器的连接。
这个客户端示例展示了如何使用 Qt 的信号与槽机制来处理 TCP 连接。这种方式使得代码更加清晰,易于维护,并且能更好地处理异步事件。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setLayout(ui->verticalLayout);client = new QTcpSocket(this);connect(client,SIGNAL(readyRead()),this,SLOT(mRead_Data_From_serve()));ui->btnDiscon->setEnabled(false);ui->btnSend->setEnabled(false);}void Widget::on_btnCon_clicked()
{client->connectToHost(ui->lineEditAddr->text(), ui->lineEditPort->text().toInt());timer = new QTimer(this);timer->setSingleShot(true);timer->setInterval(5000);connect(timer,SIGNAL(timeout()),this,SLOT(onTimeOut()));connect(client,SIGNAL(connected()),this,SLOT(onConnected()));connect(client,SIGNAL(error(QAbstractSocket::SocketError )),this,SLOT(onError(QAbstractSocket::SocketError )));this->setEnabled(false);timer->start();
}

总结

1.TCPServer类关于监听,连接,发送,接受的API
2.TCPServer在网络通信中常用的信号
3.TCPScoket在QT实现Socket常用的API
4.TCPScoket在QT实现Socket常用的信号
5.EditText的内容读取方法,内容写入方法,在特定行写入特点颜色的方法

在这里插入图片描述
希望大家可以一键三连,后续我们一起学习,谢谢大家!!!

在这里插入图片描述

相关文章:

Qt项目——Tcp网络调试助手服务端与客户端

目录 前言结果预览工程文件源代码一、开发流程二、Tcp协议三、Socket四、Tcp服务器的关键流程五、Tcp客户端的关键流程六、Tcp服务端核心代码七、客户端核心代码总结 前言 这期要运用到计算机网络的知识&#xff0c;要搞清楚Tcp协议&#xff0c;学习QTcpServer &#xff0c;学…...

4.21 从0开始配置spark-local模式

首先准备好安装包 然后使用命令解压 使用source /etc/profile命令让环境变量生效 输入命令 spark-submit --class org.apache.spark.examples.SparkPi --master local[2] /opt/module/spark-local/examples/jars/spark-examples_2.12-3.1.1.jar 10 即在spark运行了第一个程序…...

chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读

加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函数直接用emscripten::function&#xff0c;如&#xff1a; emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…...

go语言八股文

1.go语言的接口是怎么实现 接口&#xff08;interface&#xff09;是一种类型&#xff0c;它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法&#xff0c;就被认为实现了该接口。 代码的实现 package mainimport "fmt"// 定义接口 type Shape inte…...

C++——多态、抽象类和接口

目录 多态的基本概念 如何实现多态 在C中&#xff0c;派生类对象可以被当作基类对象使用 编程示例 关键概念总结 抽象类 一、抽象类的定义 基本语法 二、抽象类的核心特性 1. 不能直接实例化 2. 派生类必须实现所有纯虚函数才能成为具体类 3. 可以包含普通成员函数和…...

【Java面试笔记:基础】3.谈谈final、finally、 finalize有什么不同?

1. final、finally、finalize 的区别 final&#xff1a; 用途&#xff1a;用于修饰类、方法和变量。 修饰类&#xff1a;表示该类不能被继承。 final class ImmutableClass { // 此类无法被其他类继承 }修饰方法&#xff1a;表示该方法不能被子类重写。 class Parent {fin…...

基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结

以下是基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐&#xff0c;涵盖基础理论、模型架构、实战技巧及对比分析&#xff0c;并附表格总结&#xff1a; 1. 推荐书籍及内容说明 (1) 《深度学习》&#xff08;Deep Learning&#xff09; 作者&#xff1a;Ian Goodfellow…...

从数字化到智能化,百度 SRE 数智免疫系统的演进和实践

1. 为什么 SRE 需要数智免疫系统&#xff1f; 2022 年 10 月&#xff0c;在 Gartner 公布的 2023 年十大战略技术趋势中提到了「数字免疫系统」的概念&#xff0c;旨在通过结合数据驱动的一系列手段来提高系统的弹性和稳定性。 在过去 2 年的时间里&#xff0c;百度基于该…...

[Git] Git Stash 命令详解

1. Git Stash 的基本概念 Git Stash 是一个用于暂存当前工作目录中更改的命令。当你正在处理一个功能分支&#xff0c;但突然需要切换到另一个分支进行紧急修复或查看其他工作时&#xff0c;Git Stash 就显得非常有用。它允许你将当前工作目录中的更改保存起来&#xff0c;以便…...

ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“

产生背景&#xff1a; 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止&#xff1a; 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释&#xff1a; 说明你当前运…...

Python项目调用Java数据接口实现CRUD操作

Django Python项目调用Java数据接口实现CRUD操作&#xff1a;接口设计与实现指南 引言 在现代软件架构中&#xff0c;系统间的数据交互变得越来越重要。Python和Java作为两种流行的编程语言&#xff0c;在企业级应用中常常需要实现跨语言的数据交互。本报告将详细介绍如何在D…...

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程

进阶篇 第 5 篇&#xff1a;现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中&#xff0c;我们深入研究了经典的时间序列统计模型&#xff0c;如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛&#xff0c;但有…...

ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库

1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件…...

JavaScript 中的单例模式

单例模式在 JavaScript 中是一种确保类只有一个实例&#xff0c;并提供全局访问点的方式。由于 JavaScript 的语言特性&#xff08;如对象字面量、模块系统等&#xff09;&#xff0c;实现单例有多种方式。 常见实现方式 1. 对象字面量&#xff08;最简单的单例&#xff09; …...

深度学习基石:神经网络核心知识全解析(一)

神经网络核心知识全解析 一、神经网络概述 神经网络作为机器学习领域的关键算法&#xff0c;在现代生活中发挥着重要作用&#xff0c;广泛应用于图像识别、语音处理、智能推荐等诸多领域&#xff0c;深刻影响着人们的日常生活。它通过模拟人类大脑神经系统的结构和功能&#…...

java的反编译命令

1. javap -c: 显示方法中的字节码 2. javap -p&#xff1a; 显示所有访问级别&#xff0c;包括private 3. Javap -v&#xff1a; verbose模式&#xff0c;全信息&#xff0c;输出的内容包括&#xff1a; 类的访问标志&#xff08;access_flags&#xff09; 类名、父类、接口 …...

影刀填写输入框(web) 时出错: Can not convert Array to String

环境&#xff1a; 影刀5.26.24 Win10专业版 问题描述&#xff1a; [错误来源]行12: 填写输入框(web) 执行 填写输入框(web) 时出错: Can not convert Array to String. 解决方案&#xff1a; 1. 检查变量内容 在填写输入框之前&#xff0c;打印BT和NR变量的值&#xff…...

词语关系图谱模型

参数配置说明 sentences, # 分词后的语料&#xff08;列表嵌套列表&#xff09; vector_size100, # 每个词的向量维度 window5, # 词与上下文之间的最大距离&#xff08;滑动窗口大小&#xff09; min_count5, # 忽略出现次数小于5的…...

《C++ 模板:泛型编程的核心》

C模板详解 模板是C中实现泛型编程的重要特性&#xff0c;它允许你编写与数据类型无关的代码。模板可以分为函数模板和类模板两种。 1. 函数模板 函数模板允许你定义一个可以处理多种数据类型的函数。 基本语法 template <typename T> T functionName(T parameter1, T…...

HTTP的请求消息Request和响应消息Response

一&#xff1a;介绍 &#xff08;1&#xff09;定义 service方法里的两个参数 &#xff08;2)过程 Request:获取请求数据 浏览器发送http请求数据&#xff08;字符串&#xff09;&#xff0c;字符串被tomcat解析&#xff0c;解析后tomcat会将请求数据放入request对象 Response:…...

解决Python与Java交互乱码问题:从编码角度优化数据流

在现代软件开发中&#xff0c;跨语言系统的集成已经成为日常工作的一部分。特别是当Python和Java之间进行交互时&#xff0c;编码问题往往会成为导致数据传输错误、乱码以及难以调试的主要原因之一。 你是否曾遇到过这种情境&#xff1a;Python脚本通过标准输出返回了正确的数…...

DES、3DES、SM4 加密算法简介

1. DES&#xff08;Data Encryption Standard&#xff09; 设计时间&#xff1a;1975 年&#xff08;IBM 开发&#xff0c;1977 年被 NIST 采纳为美国联邦标准&#xff09;。 密钥长度&#xff1a;64 位&#xff08;实际有效 56 位 8 位校验&#xff09;。 分组长度&#xf…...

C++异步操作 - future async package_task promise

异步 异步编程是一种程序设计范式&#xff0c;​​允许任务在等待耗时操作&#xff08;如I/O、网络请求&#xff09;时暂停执行&#xff0c;转而处理其他任务&#xff0c;待操作完成后自动恢复​​。其核心目标是​​避免阻塞主线程​​&#xff0c;提升程序的并发性和响应速度…...

Feign 深度解析:Java 声明式 HTTP 客户端的终极指南

Feign 深度解析&#xff1a;Java 声明式 HTTP 客户端的终极指南 Feign 是由 Netflix 开源的 ​声明式 HTTP 客户端&#xff0c;后成为 Spring Cloud 生态的核心组件&#xff08;现由 OpenFeign 维护&#xff09;。它通过注解和接口定义简化了服务间 RESTful 通信&#xff0c;并…...

08前端项目----升序/降序

升序/降序 vue实现升序/降序服务器处理 vue实现升序/降序 用vue实现升序/降序&#xff0c;以及css绘制三角形 <div class"sui-navbar"><div class"navbar-inner filter"><ul class"sui-nav"><li class"active"&g…...

用Java实现简易区块链:从零开始的探索

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 区块链技术作为近年来的热门话题&am…...

JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧

进一步探讨如何使用 Puppeteer 进行动态网页爬取&#xff0c;特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时&#xff0c;确保页面元素完全加载是获取完整数据的关键。Puppeteer…...

数据结构——栈以及相应的操作

栈(Stack) 在维基百科中是这样定义的&#xff1a; 堆栈(stack) 又称为栈或堆叠&#xff0c;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合中的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和…...

SVG 与 VSCode:高效设计与开发的完美结合

SVG 与 VSCode:高效设计与开发的完美结合 引言 随着互联网技术的飞速发展,网页设计已经成为了一个重要的领域。SVG(可缩放矢量图形)作为一种矢量图形格式,因其独特的优势,在网页设计中得到了广泛应用。而VSCode(Visual Studio Code)作为一款功能强大的代码编辑器,同…...

如何应对政策变化导致的项目风险

应对政策变化导致的项目风险&#xff0c;核心在于&#xff1a;加强政策研判机制、建立动态应对流程、构建合规应急预案、强化跨部门联动、提升项目柔性与调整能力。其中&#xff0c;加强政策研判机制 是所有防范工作中的“前哨哨兵”&#xff0c;可以让项目团队在政策风向转变之…...