TCP调试工具顾名思义用来调试TCP通信的,网上这样的工具N多,之前用.NET写过一个,无奈在XP下还要安装个.NET框架才能运行,索性这次用QT重写,发现QT写TCP通信比.NET还要便捷一些,运行效率貌似要高,还能识别客户端断开,这个真神奇,除了断电之外。
项目名称:TCP调试工具
开发环境:WIN7+QT4.7+QT CREATOR2.8+MINGW
技术实现:通过QTcpServer和QTcpSocket类,解析协议并作出处理
实现功能:ASCII格式和16进制数据收发,支持多个客户端收发消息,可以指定客户端发送消息,动态增加和移除已连接客户端。
运行截图:
粗略步骤:
第一步:添加主界面,布局好主界面,并命名好控件,例如服务端的清空按钮命名为btnClearServer,客户端的清空按钮命名为btnClearClient。
第二步:编写服务端中客户端通信类,服务端可以接受多个客户端的连接,这里采用了同步通信机制,先编写myTcpClient类,封装了客户端连接断开接收数据的操作。具体代码如下:
myTcpClient.h #ifndef MYTCPCLIENT_H #define MYTCPCLIENT_H #include <QTcpSocket> class myTcpClient : public QTcpSocket { Q_OBJECT public: explicit myTcpClient(QObject *parent = 0,int clientID=0); private: int clientID; signals: void ClientReadData(int clientID,QString IP,int Port,QByteArray data); void ClientDisConnect(int clientID,QString IP,int Port); private slots: void ReadData(); void DisConnect(); public slots: }; #endif // MYTCPCLIENT_H myTcpClient.cpp #include "mytcpclient.h" #include <QHostAddress> #include "myhelper.h" myTcpClient::myTcpClient(QObject *parent,int clientID) : QTcpSocket(parent) { this->clientID=clientID; connect(this,SIGNAL(readyRead()),this,SLOT(ReadData()));//挂接读取数据信号 connect(this,SIGNAL(disconnected()),this,SLOT(DisConnect()));//关闭连接时,发送断开连接信号 //如果关闭连接自动删除,则下次不能再次监听,奇怪的问题 //connect(this,SIGNAL(disconnected()),this,SLOT(deleteLater()));//关闭连接时,对象自动删除 } void myTcpClient::ReadData() { myHelper::Sleep(100); //读取完整一条数据并发送信号 QByteArray data=this->readAll(); emit ClientReadData(this->clientID,this->peerAddress().toString(),this->peerPort(),data); } void myTcpClient::DisConnect() { //断开连接时,发送断开信号 emit ClientDisConnect(this->clientID,this->peerAddress().toString(),this->peerPort()); }