Qt实践录:TCP网络调试助手
由于项目需要使用到网络调试及测试,为了练手,使用 Qt 编写一个串口调试助手。本文按开发的过程进行简单介绍,同时也涉及部分用到的模块代码。详细代码参考源码仓库。
在代码复用方面,笔者认为 Qt 比 MFC 好,比如主窗口代码可以直接使用,当然,还要修改工程文件名称和对应的依赖库,界面控件也要重新设计和实现。这也是笔者喜欢直接使用 Qt Creator 创建的默认文件、类的原因。另外,如果使用纯代码实现窗体布局,其复用程度比用 Qt Creator 更加好。 实际上,本文的工程,就是在前一文章 《Qt实践录:串口调试助手》 源码基础上修改而得的。窗体基本设置、图标、状态栏、十六进制显示,定时发送等等代码,直接沿用。因此,文中不再重复前文所涉及的模块。
工具特性
功能
- TCP客户端、服务端。
- 十六进制收、发。
- 时间戳显示
- 为方便测试,本工具同时具备服务端和客户端功能,可实现自发自收。也可单独使用。
已知 Bug
连接、断开等逻辑处理未完善。
针对服务器,理论上应该需要根据不同客户端发送数据(或定向,或全部),当前版本未实现,仅取最后一个客户端。
Qt 相关知识
- MainWindow设计。
- Qt TCP编程。
- 常用控件:按钮、复选框、文本编辑框、控件贴图。应用程序logo。
- button字体。
- 文本编辑框自定义显示的文字颜色。
运行结果如图1所示:
图1
开发过程
工程相关
Qt 中网络相应的依赖库为network
,需要在工程文件中添加对应的库,如下:
QT += core gui network
TCP编程
相关头文件及变量
#include <QTcpServer>
#include <QTcpSocket>QTcpServer *m_tcpServer;QList<QTcpSocket*> m_clientList;QTcpSocket *m_tcpCliSocket;
其中,m_tcpServer 用于TCP服务器,m_tcpCliSocket 用于保存连接的客户端。m_tcpCliSocket 用于客户端连接。
服务端
创建服务端:
// server
m_tcpServer = new QTcpServer();// 连接newConnection信号,svr_newConnect中处理客户端的连接
connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(svr_newConnect()));监听端口:
m_tcpServer->listen(QHostAddress::Any, port);关闭:
m_tcpServer->close();接收数据:
tcpSocket->readAll();发送数据:
tcpSocket->write(sendData, sendData.size());
当有新客户端连接时,会自动调用svr_newConnect
函数,该函数保存客户端socket,并关联数据接收信号和槽:
void MainWindow::svr_newConnect()
{printDebugInfo("get new connect");QTcpSocket *tcpSocket = m_tcpServer->nextPendingConnection();//新的客户端发起的连接QHostAddress clientIp = tcpSocket->peerAddress();//客户端的IPquint16 port = tcpSocket->peerPort();//客户端的端口if(m_clientList.contains(tcpSocket)){printDebugInfo(QString("%1:%2 already connected").arg(clientIp.toString()).arg(port));}else{printDebugInfo(QString("new connect from %1:%2").arg(clientIp.toString()).arg(port));m_clientList.append(tcpSocket);//记录下客户端发起的连接connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(svr_disconnect()));connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead())); // 数据接收}
}
当客户端发送数据时,会自动触发readyRead
函数,该函数读取数据并显示:
void MainWindow::readyRead()
{QTcpSocket *tcpSocket = static_cast<QTcpSocket *>(QObject::sender());QByteArray buffer = tcpSocket->readAll();showRecvData("SERVER> ", buffer);
}
客户端
服务端的IP和端口,由界面输入,连接服务端函数如下:
QHostAddress serverIp;
serverIp.setAddress(ui->cbRemoteIP->currentText());
uint16_t port=ui->cbRemotePort->currentText().toUShort();
m_tcpCliSocket->connectToHost(serverIp, port);
注意,不能使用isOpen
或isValid
来判断是否连接成功,需要使用waitForConnected
判断,示例如下:
if (!m_tcpCliSocket->waitForConnected(600))
{printDebugInfo("connect failed");return;
}
客户端相关信号和槽:
// client
m_tcpCliSocket = new QTcpSocket();
connect(m_tcpCliSocket, SIGNAL(connected()), this, SLOT(cli_connected())); // 客户端连接
connect(m_tcpCliSocket, SIGNAL(disconnected()), this, SLOT(cli_disconnected())); // 客户端断开连接
connect(m_tcpCliSocket, SIGNAL(readyRead()), this, SLOT(cli_receiveData())); // 客户端接收数据
当远程服务器发送数据到客户端时,会自动触发cli_receiveData
函数:
void MainWindow::cli_receiveData()
{QByteArray buffer;buffer = m_tcpCliSocket->readAll();showRecvData("CLIENT> ", buffer);
}
界面逻辑
界面设计
界面使用设计师进行设计,如图2所示。界面多数功能与前面文章一样,故不再涉及。
图2
文本颜色
本工程接收显示的文本有三种类型:时间戳+提示语、服务端数据、客户端数据,为了区别,使用不同颜色显示。核心代码如下:
if (m_showTimestamp){QDateTime dateTime(QDateTime::currentDateTime());timeStr = "[" + dateTime.toString("yyyy-MM-dd HH:mm:ss.zzz") + "] ";}if (m_recvHex == 1){info = buffer.toHex(' ').data();}else{info = QString(buffer);}// 根据类型,使用不同颜色显示if (tips.contains("SERVER")){info = "<font color=\"blue\">" + info + "</font>";}else{info = "<font color=\"green\">" + info + "</font>";}ui->txtRecv->appendHtml("<font color=\"gray\">" + timeStr + tips + "</font>");ui->txtRecv->appendHtml(info);
利用 QPlainTextEdit 的 appendHtml 函数,可以使用 html 格式指定颜色。本工程中,提示语用灰色,服务端接收的数据用蓝色,客户端接收数据用绿色。
其它
笔者在此工具基础上实现了自定义二进制协议,并对 ESP8266 进行操作,包括指示LED灯、继电器、出厂恢复、FOTA固件升级以及运行态的功能测试验证等操作,同时整合了前面的串口功能,实现一个工具进行全功能测试。由于与本文关联不大,不再展开。仅以截图展示:
代码仓库
本工程所有源码均可自由自主使用,包括但不限于添加、删除、修改,商用、自用。由此带来的成果/后果概与作者无关。限于水平能力,本程序无任何质量保证,本程序作者无提供服务之义务。
仓库地址在此 。
Qt实践录:TCP网络调试助手相关推荐
- Qt实践录:串口调试助手
由于项目需要使用到串口调试及测试,为了练手,使用 Qt 编写一个串口调试助手.本文按开发的过程进行简单介绍,同时也涉及部分用到的模块代码.详细代码参考源码仓库. 工具特性 具体功能 具备串口收发功能. ...
- Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)
在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发,教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程,后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一 ...
- TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行
对于网络调试助手如NetAssist等连接不上服务器且左下角显示"1035 未知错误"的问题,本人困惑许久,参考了网上的多种解决方法,有的说法是网络调试助手的版本太低,在Win10 ...
- QT开发网络调试助手项目总结
之前整理了一些使用QT开发串口调试助手的项目. 博客地址:上位机总结 这次继续整理一些使用QT开发网络调试助手的项目. Qt开源作品41-网络调试助手增强版V2022 我的QT学习之路,编写UDP+t ...
- (转)PC机使用网络调试助手获取onenet的数据(https://blog.csdn.net/qq_29219435/article/details/78480872)
在上一篇博客中,我写了如何向onenet发送数据,本文主要介绍通过http协议GET到之前上传的数据. 1 2 http://blog.csdn.net/qq_29219435/article/det ...
- PC机使用网络调试助手获取onenet的数据
在上一篇博客中,我写了如何向onenet发送数据,本文主要介绍通过http协议GET到之前上传的数据. http://blog.csdn.net/qq_29219435/article/details ...
- Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)终极版开源
时隔半年,对网络调试助手工具进行所有代码重写,这次目录结果整齐的一逼,代码整齐的一逼,非常完善了,打死也不再改版了.这次真的打死也不再改版了. 旧版本1:http://www.qtcn.org/bbs ...
- Qt精美应用程序界面设计,多功能(包含基于sql数据库的音乐、视频播放器、相册,串口、网络调试助手、游戏、天气查询等功能)
去年寒假疫情,我在家闲着没事,自制了一个由Qt Creator开发的精美多功能程序软件,功能包含音乐播放器.视频播放器.天气查询.串口调试助手.相册.网络调试助手.小游戏等,主界面如下图所示: 界面展 ...
- 网络调试助手的使用 调试TCP,UDP
网络调试助手是集TCP/UDP服务端客户端一体的网络调试工具,可以帮助网络应用设计.开发.测试人员检查所开发的网络应用软硬件的数据收发状况,提高开发的速度,是TCP/UDP应用开发助手. 集成TCP/ ...
最新文章
- leetcode算法题--扁平化多级双向链表★
- Package name must have at least two identifiers 解决办法
- Get Started Part 2
- 嵌入式工程师最后都选择了什么职位?
- java8四大核心函数式接口(模拟实现,全网最通俗易懂)
- sklearn之线性回归和梯度下降
- Android接收短信
- pyglet -- 视频播放器 (简单实现,效果不是太好,切换资源会卡死)(三)
- python软件-python 2.7官方版
- 淘宝云梯分布式计算平台架构
- sqlserver sql行专列_Sqlserver 列转行 行转列
- sql 结果相加_SQL联结语句
- 张宇1000题高等数学 第十八章 多元函数积分学(二)
- 【转载】超级弹丸论破2再见绝望学园攻略
- Json-Handle插件下载安装使用
- Photoshop2018安装
- [CityHunter]游戏流程设计及技术要点
- 3dmax软件怎样一键取消视图背景网格
- 2020年中国车规级IGBT(新能源汽车用IGBT)市场规模现状及发展潜力分析[图]
- 梯形图调用c语言编写程序,简单使用C语言写梯形图精简V2.0.pdf
热门文章
- MongoDB 3.0+访问数据库的方法
- python试卷生成_Python学习笔记文件读写之生成随机的测试试卷文件
- 你心中有这样的人吗?
- 一加手机史上超大购机优惠 以旧换新至高补贴3800元
- TECH4ALL科技架起联结外界的桥梁,助力人与自然和谐共生
- 寂寞了就去搞钱?俞敏洪举报“俞敏洪”:“搞钱论”没一句话是我说的
- 数智时代下 IT终端部署如何赋能高校构建智慧教育新模式
- 华为P50系列确定29日发布:但遗憾的是...
- realme Pad通过认证:搭载7100mAh大容量电池
- 《王者荣耀》宣布将推独立女子电竞赛事:跟进奥运会