手把手带你做一个自己的网络调试助手(4) - 优化完善

了解全部信息,请关注专栏:

QT网络调试助手_mx_jun的博客-CSDN博客

优化服务器


1.不能设置随拖动变大:


  this->setLayout(ui->verticalLayout);


2. 未连接就能发送消息:


//在处理新连接槽函数中加入
    if(!ui->btnSend->isEnabled()){//只有客户端连接上之后才能向发送数据
      ui->btnSend->setEnabled(true);
     }

//在构造和端口连接/停止监听中加入
  ui->btnSend->setEnabled(false);

3.  设置光标位置最下

 在读取数据的信号处理函数

    ui->textEditRev->moveCursor(QTextCursor::End);
    ui->textEditRev->ensureCursorVisible();

4. 防止无客户端接入时候发送  -->  造成访问越界

在发送槽函数中添加

     if(tcpClients.isEmpty()){ //客户端数组为空,没有发送对象
         QMessageBox msgBox;
         msgBox.setWindowTitle("发送失败");
         msgBox.setText("没有客户端接入!");
         msgBox.exec();
         return;
     }

5.  实现comboBoxChildren 的快速度刷新

-->添加后马上刷新上去,断开连接后马上删除

   
在处理新连接的函数中添加:


  //当有新的连接接入的时候,刷新comboBox上的内容
    ui->comboBoxChildren->addItem(QString::number(connection->peerPort()));//添加新的连接
    ui->comboBoxChildren->setCurrentText(QString::number(connection->peerPort()));//将新的连接显示未当前连接


//在端口连接信号处理函数中添加


       //根据当前端口号找到对应的索引
       int tmpIndex =ui->comboBoxChildren->findText(QString::number(tmpSock->peerPort()));
       ui->comboBoxChildren->removeItem(tmpIndex); //根据索引删除comboBox上的条目
             if(ui->comboBoxChildren->count() == 0) //当没有客户端接入得到时候让发送按钮不可选
             ui->btnSend->setEnabled(false);


 

6.优化下标管理:

//在btnSend进行修改通过名字匹配当前客户端:

   if(ui->comboBoxChildren->currentText() != "all"){ //选单独一个客户端发送
       QString currentName = ui->comboBoxChildren->currentText();//拿到当前客户端对应的名字
       for(QTcpSocket *tmp:tcpClients){//遍历客户端数组
           if(QString::number(tmp->peerPort())==currentName)//当客户端名字匹配才发送
               tmp->write(ui->textEditSend->toPlainText().toStdString().c_str());

       }

        // 通过全局的childIndex 匹配用户选择的客户端进行数据发送
        //tcpClients[childIndex]->write(ui->textEditSend->toPlainText().toStdString().c_str());
    }

================================================

客户端优化:

细节: 信号与槽中不能带参数-->否则不起作用

连接判断优化

 ip地址不同的时候也会显示连接成功 --> 之前的判断链接中也加入了 -- 不合理

连接按钮槽函数

绑定信号与槽,进行 超时判断和  连接处理 和  错误处理

还包括定时器的初始化 

void Widget::on_btnConnect_2_clicked()
{
    qDebug()<<"connecting";

    // 读取客户端输入的ip 和 端口号进行连接
    client->connectToHost(ui->lineEditIpAddr->text(),ui->lineEditPort->text().toUInt());
    //设置定时器 -> 进行超时判断:
    timer = new QTimer(this);
    timer->setSingleShot(true); //这个定时器只会被触发一次
    timer->setInterval(5000); //5000ms - 5s
    //绑定信号与槽,处理定时器超时
    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(); // 启动定时器
}

连接处理槽函数

// 信号与槽处理连接状态
void Widget::onConnected()
{
    timer->stop(); //连接成功 --> 不超时-->定时器停止
    this->setEnabled(true); //连接成功后让窗口可用
    ui->textEditRev->append("连接成功!"); //在文本框内给出连接提示
    //设置控件状态
    ui->btnConnect_2->setEnabled(false);
    ui->lineEditPort->setEnabled(false);
    ui->lineEditIpAddr->setEnabled(false);
    ui->btnDisconnect->setEnabled(true);
    ui->btnSend->setEnabled(true);
}

连接错误处理槽函数

void Widget::onError(QAbstractSocket::SocketError error)
{
  qDebug()<<"连接错误"<<error;
  ui->textEditRev->insertPlainText("连接出错:"+client->errorString());
  this->setEnabled(true); //连接超时,,让窗口可用
  on_btnDisconnect_clicked(); // 终止连接
}

连接超时处理槽函数

void Widget::onTimeOut()
{
  ui->textEditRev->insertPlainText("连接超时");
  client->abort(); //放弃当前连接
  this->setEnabled(true); //连接超时,,让窗口可用
}
 

效果演示:

设置正确的ip -->连接成功

设置错误的ip ->定时器计时5s,没连接上就是超时

连接超时

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CC精品教程】osbg格式三维实景模型全解

数据格式同样都是osgb,不同软件生产的,建模是参数不一样,还是有很大区别的,本讲进行一一讲解。 文章目录 一、CC生产的osbg1. osgb的文件结构2. metadata.xml是什么?​(1)EPSG模式metadata.xml​(2)EPSG带+模式metadata.xml​(3)ENU模式metadata.xml​(4)LOCAl模式…

《大道平渊》· 拾贰 —— 天下大事必作于细:做好每一件小事,必然大有所成!

《平渊》 拾贰 "天下难事必作于易&#xff0c;天下大事必作于细。" 社群一位大佬最近在研究新项目, 他做事的 "方法论" 令我深受启发。 他在测试项目时, 每一步都做的非常细致&#xff1a; 整个项目的测试都被划分为一件件小事, 然后有条不紊地推进…… …

postgresql之翻页优化

列表和翻页是所有应用系统里面必不可少的需求&#xff0c;但是当深度翻页的时候&#xff0c;越深越慢。下面是几种常用方式 准备工作 CREATE UNLOGGED TABLE data (id bigint GENERATED ALWAYS AS IDENTITY,value double precision NOT NULL,created timestamp with time zon…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

Java面试八股之静态变量和实例变量的区别有哪些

Java静态变量和实例变量的区别有哪些 存储位置和生命周期&#xff1a; 静态变量&#xff1a;静态变量属于类级别&#xff0c;存储在Java的方法区&#xff08;或称为类区&#xff0c;随JVM实现而异&#xff0c;现代JVM中通常在元数据区内&#xff09;&#xff0c;并且在类首次…

天锐绿盾,怎么防止公司内部核心文件、文档、设计图纸、源代码、音视频等数据资料外泄

天锐绿盾通过多种技术和管理手段&#xff0c;全面保护公司内部的核心文件、文档、设计图纸、源代码、音视频等数据资料&#xff0c;防止外泄。以下是具体的防泄密措施&#xff1a; PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5d…

【技术干货】Linux命令“du-sh和df”执行结果存在差异,问题分析及处理过程

1.du-sh和df的差异 du和df是两个不同的Linux命令&#xff0c;它们⽤于查看磁盘空间的使⽤情况。但是它们有⼀些区别&#xff1a; • du&#xff08;diskusage&#xff09;会扫描每个⽂件和⽬录&#xff0c;并计算它们的总⼤⼩。[1]du-sh*会显⽰当前⽬录下每个⽂件或⽬录的⼤⼩…

APD系列特高频局放监测装置

安科瑞电气股份有限公司 祁洁 15000363176 一、产品概述 现阶段&#xff0c;电力系统对于电能的质量提出越来越高的要求&#xff0c;不仅要确保供电稳定可靠&#xff0c;而且供电的安全性也是重要要求。电力系统中&#xff0c;金属封闭开关设备得到广泛应用&#xff0c;因…

基于springboot实现影院订票系统项目【项目源码+论文说明】

基于springboot实现影院订票系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本影院订票系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在…

安卓手机电脑同步数据,2个方法,有效避免数据膨胀

如今&#xff0c;我们的手机已经成为了数字生活的中心舞台&#xff0c;而电脑则是我们工作和娱乐的得力助手。两者之间的数据同步&#xff0c;就像是搭建了一座无形的桥梁&#xff0c;让我们的生活和工作变得更加便捷和高效。如何高效进行手机电脑同步数据呢&#xff1f;在这篇…

第十三章 组合模式

目录 1 组合模式介绍 2 组合模式原理 3 组合模式实现 4 组合模式应用实例 5 组合模式总结 1 组合模式介绍 组合模式(Composite Pattern) 的定义是&#xff1a;将对象组合成树形结构以表示整个部分的层次结构.组合模式可以让用户统一对待单个对象和对象的组合. 2 组合模式…

【C++题解】1457 - 子数整除

问题&#xff1a;1457 - 子数整除 类型&#xff1a;循环应用 题目描述&#xff1a; 于一个五位数 abcde &#xff0c;可将其拆分为三个子数&#xff1a; sub1abc sub2bcd sub3cde 例如&#xff0c;五位数20207 可以拆分成sub1202 sub2020 (也就是 20) sub3207 现在给定一个正…

中文词云MATLAB

wordcloud Create word cloud chart from text, bag-of-words model, bag-of-n-grams model, or LDA model name{1} {数字图像处理}; name{2} {禹晶 肖创柏 廖庆敏}; name{3} {1 绪论,2 数字图像基础,3 空域图像增强,4 频域图像增强,7 图像压缩编码,9 二值图像形态学,8 图像…

k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例

文章目录 前言应用环境1.VPA应用案例 updateMode: "Off"&#xff08;1&#xff09;创建应用实例&#xff08;2&#xff09;创建vpa 2.VPA应用案例 updateMode: "Auto"&#xff08;1&#xff09;创建应用 &#xff08;2&#xff09;创建vpa&#xff08;3&am…

护眼台灯哪个品牌好?几款性价比最高的护眼台灯推荐

在过去&#xff0c;科技尚未发展至如今这般先进水平时&#xff0c;晚上需要照明的时候&#xff0c;我们通常只能依赖白炽灯。尽管白炽灯以其低成本和接近自然光的显色性获得了一定的青睐&#xff0c;随着时代的发展&#xff0c;现在市面上出现了更为护眼的选择——LED台灯。然而…

VMware导入vmdk文件(亲测有效)

场景&#xff1a;从别的地方拷贝了一个系统镜像&#xff0c;实际测试案例是从vulnhub下载的Kioptix Level #4靶场解压缩以后的文件是【Kioptrix4_vmware.vmdk】后缀为名为vmdx,使用常规的方式【文件-----打开】的方式&#xff0c;不能导入虚拟机&#xff0c;现在演示如何导入到…

intel新CPU性能提升68%!却在内存上违反祖训

前几天的台北电脑展「Computex」&#xff0c;各家都拿出了看家本领。 老朋友 AMD 在会展上发布了最新的锐龙 9000 系列和自己家移动处理器 HX AI 系列&#xff0c;IPC 和能效都取得了不错的进步。 当然隔壁蓝厂 intel 也没闲着&#xff0c;当即就掏出了下一代的低功耗移动端处…

【SQL边干边学系列】05高级问题

文章目录 前言回顾高级问题32.高价值客户33.高价值的客户-总订单数34.高价值的客户-带有折扣35.月末订单36.具有许多详细信息行的订单 答案32.高价值客户33.高价值的客户-总订单数34.高价值的客户-带有折扣35.月末订单36.具有许多详细信息行的订单 未完待续 前言 该系列教程&am…

GaussDB技术解读——GaussDB架构介绍(二)

上篇图文&#xff0c;从GaussDB关键架构目标、GaussDB分布式架构、数据计算路由层&#xff08;Coordinator&#xff09;关键技术方案等三方面对GaussDB架构进行了介绍。本篇将从数据持久化存取层(DataNode)关键技术方案、全局事务管理层&#xff08;GTM&#xff09;关键技术方案…

大一学生分享网络编程聊天室-简单私聊

每天过得充实&#xff0c;你将不会焦虑 ---同行者联盟 Socket 是一种规范(标准)&#xff0c;封装了TCP协议的通信细节&#xff0c;使得我们使用它就可以完成与远端计算机的TCP链接&#xff0c;以及数据的传输。并且可以完成数据传输基于双向流的读写操作&#xff0c;Java语言…