手把手带你做一个自己的网络调试助手(1) - TCP服务器准备

程序设计流程图

TCP 服务器

ui界面搭建

Tcp服务器建立连接 - listen() + connect()

1.在构造函数中进行如下初始化:

通过 QNetworkInterface 类的  allAddresses 这一API 获得可用IP地址(包括IPv4 和 IPv6)

然后通过QHostAddress类的  protocol 这一API 进行筛选,只读取IPv4的数据

(QAbstractSocket::IPv4Protocol)

    server = new QTcpServer(this); // 初始化TcpServer对象//当有新的客户端接入时候建立连接:connect(server,SIGNAL(newConnection()),this,SLOT(on_NewClient_Connect()));// 设置控件状态 -> 没连接前不能断开连接ui->btnStopListen->setEnabled(false);ui->btnDisconnect->setEnabled(false);//  获取本机可用的ip//QList<QHostAddress> QNetworkInterface::allAddresses()QList<QHostAddress> addrs =QNetworkInterface::allAddresses();for(QHostAddress tmp:addrs){if(tmp.protocol() == QAbstractSocket::IPv4Protocol)  // 协议是IPV4协议才读取ui->comboBoxAddr->addItem(tmp.toString()); // 把读取到的ip地址添加到comboBox的框中}

 2.处理新的连接的槽函数

//处理新连接槽函数
void Widget::on_NewClient_Connect()
{//qDebug()<<"new Cline In";if(server->hasPendingConnections()){ //有新的连接接入QTcpSocket *connect = server->nextPendingConnection();//获取新的连接的信息qDebug()<<"Client Addr:"<<connect->peerAddress().toString()<<" host:"<<connect->peerPort();ui->textEditRev->insertPlainText("客户端地址:"+connect->peerAddress().toString()+"\n端口号:"+QString::number(connect->peerPort()));}}

3.监听按钮槽函数

//监听按键槽函数
void Widget::on_btnListen_clicked()
{//QHostAddress addr("10.171.24.231"); // 构造合适类型的ip地址 -- 固定IPint port = ui->lineEditPort->text().toInt();//if(!server->listen(QHostAddress::Any,port)){ //Any -- 监听任意if(!server->listen(QHostAddress(ui->comboBoxAddr->currentText()),port)){ //根据combboBox选择的ip地址监听,QHostAddress(QString) -- 构造出合适对象qDebug()<<"listen error";return;}qDebug()<<"listen success";//监听成功,设置控件状态ui->btnListen->setEnabled(false);ui->btnStopListen->setEnabled(true);ui->btnDisconnect->setEnabled(true);}

效果演示:

通过下图可以发现,我们已经成功建立连接并且获得了正确的IP地址和端口号

添加串口被占用弹窗提示

添加代码到监听槽函数

//监听按键槽函数
void Widget::on_btnListen_clicked()
{//QHostAddress addr("10.171.24.231"); // 构造合适类型的ip地址 -- 固定IPint port = ui->lineEditPort->text().toInt();//if(!server->listen(QHostAddress::Any,port)){ //Any -- 监听任意if(!server->listen(QHostAddress(ui->comboBoxAddr->currentText()),port)){ //根据combboBox选择的ip地址监听,QHostAddress(QString) -- 构造出合适对象qDebug()<<"listen error";QMessageBox msgBox;msgBox.setWindowTitle("监听失败");msgBox.setText("端口号被占用");msgBox.exec();return;}qDebug()<<"listen success";//监听成功,设置控件状态ui->btnListen->setEnabled(false);ui->btnStopListen->setEnabled(true);ui->btnDisconnect->setEnabled(true);}

效果演示

Tcp服务器接收

添加信号与槽

在处理新连接槽函数中,添加读取消息的信号与槽

    //建立信号与槽来读取内容:
    connect(connection,SIGNAL(readyRead()),this,SLOT(on_readyRead_hanler()));

实现接收槽函数

//  读取数据的信号处理函数
void Widget::on_readyRead_hanler()
{//使用sender() --来获得信号额发出者 -- 局部变量QTcpSocket *tmpSock = qobject_cast<QTcpSocket *>(sender());QByteArray revData = tmpSock->readAll();ui->textEditRev->insertPlainText("客户端: "+revData);
}

效果演示

客户端断开检测

实现方法一 - disconnected

在建立新连接那建立信号连接

connect(connection,SIGNAL(disconnected()),this,SLOT(mdisconnected()));

实现断开检测槽函数

// 断开连接检测
void Widget::mdisconnected()
{QTcpSocket *tmpSock = qobject_cast<QTcpSocket *>(sender());//qDebug()<<"client  out!";ui->textEditRev->insertPlainText("客户端断开!");tmpSock->deleteLater(); //资源回收
}

方法二 - statechanged

同上建立信号连接

   connect(connection,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
            this,SLOT(mstateChanged(QAbstractSocket::SocketState)));

实现断开检测槽函数

void Widget::mstateChanged(QAbstractSocket::SocketState socketState)
{qDebug()<<"client  out In state"<<socketState;switch (socketState) {case QAbstractSocket::UnconnectedState://case QAbstractSocket::ClosingState:ui->textEditRev->insertPlainText("客户端断开!");break;}

实现效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用vite从0开始搭建vue项目

使用Vite从0开始创建vue项目 第一步&#xff1a;创建项目目录 mkdir vue-demo -创建目录 cd vue-demo --进入项目 npm init -y --生成package.json文件 第二步&#xff1a;安装vite、typescript--ts、vue、vitejs/plugin-vue--对单文件组件、热重载、生产优化的支持 pnpm…

“三夏”农忙:EasyCVR/EasyDSS无人机技术助推现代农业走向智能化

随着科技的飞速发展&#xff0c;无人机技术已经逐渐渗透到我们生活的方方面面。其中&#xff0c;无人机在农业领域的应用尤为引人注目。它们不仅提高了农业生产的效率&#xff0c;还为农民带来了更便捷、更智能的种植方式。 无人机在农业应用场景中&#xff0c;通过搭载各种设备…

【数据结构】 -- 堆 (堆排序)(TOP-K问题)

引入 要学习堆&#xff0c;首先要先简单的了解一下二叉树&#xff0c;二叉树是一种常见的树形数据结构&#xff0c;每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。它具有以下特点&#xff1a; 根节点&#xff08;Root&#xff09;&#xff1a;树的顶部节…

电脑回收站清空了怎么恢复回来?分享四个好用数据恢复方法

电脑回收站清空了还能恢复回来吗&#xff1f;在使用电脑过程中&#xff0c;很多小伙伴都不重视电脑的回收站,&#xff0c;有用的没用的文件都往里堆积。等空间不够的时候就去一股脑清空回收站。可有时候会发现自己还需要的文件在回收站里&#xff0c;可回收站已经被清空了……那…

YoloV9改进策略:主干网络篇|MobileNetV4主干替换YoloV9的BackBone(独家原创)

摘要 今年&#xff0c;轻量级王者MobileNetV4闪亮登场&#xff01;在我们这篇文章里&#xff0c;我们把MobileNetV4加入到了YoloV9中&#xff0c;对MobileNetV4的层数和卷积层核做了适当的修改&#xff0c;然后替换原有的BackBone。哈哈&#xff0c;你猜怎么着&#xff1f;效果…

基于JSP的医院远程诊断系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP Servlet JSPBean 工具&#xff1a; IDEA/Eclipse、Navica…

UltraScale+系列模块化仪器,可以同时用作控制器、算法加速器和高速数字信号处理器

基于 XCZU7EG / XCZU4EG / XCZU2EG • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 基于 Xilinx Zynq UltraScaleMPSoC 的 FPGA 技术&#xff0c;采用 Xilinx Zynq UltraScale&a…

Mysql基础进阶速成2

看着篇文章之前先看我的前一章&#xff1a;MySQL基础进阶速成1 函数&#xff1a; 每个字段使用一个函数&#xff1a;select 函数(字段名)from 表名 upper&#xff1a;将字符串中的字母大写 lower&#xff1a;将字符串中的字符小写 max&#xff1a;得到最大值 min&#xf…

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测试 • 数字音频测试&#xff1a;平板电…

高考志愿填报:大学学什么专业比较好呢?

准高三一枚&#xff0c;比较迷茫&#xff0c;求推荐一些专业以后比较好就业&#xff0c;发展前景较好的。听说互联网行业比较吃香&#xff0c;有想过以后做运营这一块&#xff0c;但是不知道应该在大学选什么专业&#xff0c;求推荐吧&#xff01; 学什么专业好&#xff1f; 这…

Vitis HLS 学习笔记--global_array_RAM初始化及复位

目录 1. 简介 2. 示例代分析 2.1 源代码 2.2 URAM 不可用 2.3 代码功能解释 2.4 综合报告 2.4.1 顶层控制接口 2.4.2 软件 IO 信息 2.4.3 存储绑定 3. 对比两种 solution 3.1 solution_A 3.2 solution_B 4. 总结 1. 简介 在C程序中&#xff0c;数组是一种基本的…

LLM的基础模型8:深入注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

在线按模板批量生成文本工具

具体请前往&#xff1a;在线按模板批量生成文本工具

URL的编码解码(一),仅针对ASCII码字符

用十六进制对特定字符编码&#xff0c;利用百分号标识搜索字符串解码十六进制字符。 (笔记模板由python脚本于2024年06月09日 18:05:25创建&#xff0c;本篇笔记适合喜好探寻URL的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

Java Set系列集合的使用规则和场景(HashSet,LinkedHashSet,TreeSet)

Set集合 package SetDemo;import java.util.HashSet; import java.util.Iterator; import java.util.Set;public class SetDemo {public static void main(String[] args) {/*Set集合的特点&#xff1a;1.Set系列集合的特点&#xff1a;Set集合是一个存储元素不能重复的集合方…

Vue13-计算属性的简写

一、计算属性的简写 注意&#xff1a; 当计算属性只有get&#xff0c;没有set的时候&#xff0c;才能用简写形式&#xff01;&#xff01;&#xff01;

svn的使用

【图文详解】入职必备——SVN使用教程-CSDN博客 使用SVNBucket作为服务端,来辅助学习. 什么时候会产生冲突呢? 原本A,B,服务器的版本都一致,都是最新版. A修改文件m,向服务器提交 B修改文件m,向服务器提交,这时候出现了冲突 双击冲突的文件,手动修改

---java 抽象类 和 接口---

抽象类 再面向对对象的语言中&#xff0c;所以的对象都是通过类来描述的&#xff0c;但如果这个类无法准确的描述对象的 话&#xff0c;那么就可以把这个类设置为抽象类。 实例 这里用到abstract修饰&#xff0c;表示这个类或方法是抽象方法 因为会重写motifs里的show方法…

【爬虫实战项目一】Python爬取豆瓣电影榜单数据

目录 一、环境准备 二、编写代码 2.1 分页分析 2.2 编码 一、环境准备 安装requests和lxml pip install requests pip install lxml 二、编写代码 2.1 分页分析 编写代码前我们先看看榜单的url 我们假如要爬取五页的数据&#xff0c;那么五个url分别是&#xff1a; htt…

再读高考作文题

新课标I卷&#xff1a;讨论了随着互联网和人工智能的普及&#xff0c;问题是否会变得越来越少&#xff0c;要求考生写一篇文章&#xff0c;表达自己对于这一现象的联想和思考。 从来就没有什么救世主 AI也不是​​​​​ 一直不会写作文&#xff0c;直到高中&#xff0c;才堪堪…