我的QT学习之路,编写UDP+tcp网络调试助手
我的一名QT小白,阅读基本入门书籍之后,编写的QT网络助手,希望各位大神指点一二表
截图如下:


代码:
头文件;
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>
#include <QMessageBox>
/*
* T以下为UDP代码编写边开
*/
#include<QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QTime>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
QTcpSocket m_client;
QTcpServer m_server;
/*
* UDP
*/
QUdpSocket Udp_Socket;
QString targetAddr;
int targetPort;
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_comboBox_currentIndexChanged(int index);//下拉菜单
void on_pushButton_open_clicked();//链接监控
void on_pushButton_send_clicked();//发送
void on_pushButton_clear_send_clicked();//清空发送
void on_pushButton_clear_receive_clicked();//清空接受
/*
* 以下自定义槽函数
*/
//客户端
void onudpConnected();
void onudpDisconnected();
void onudpDataReady();
void onudpBytesWritten(qint64 bytes);
void onudpErr(QAbstractSocket::SocketError socketError);
//客户端
void onClientConnected();
void onClientDisconnected();
void onClientDataReady();
void onClientBytesWritten(qint64 bytes);
void onClientErr(QAbstractSocket::SocketError socketError);
//服务器槽函数
void onServerNewConnection();
void onServerConnected();
void onServerDisconnected();
void onServerDataReady();
void onServerBytesWritten(qint64 bytes);
private:
void startConnect(bool ison);
void initClientSignals(); //初始化客户端信号槽
bool startClient(); //启动客户端
void initServerSignals(); //初始化客户端信号槽
bool startServer(); //启动服务器
//以下为添加UDP功能开始
void initudpSignals(); //初始化客户端信号槽
bool startudpClient(); //启动客户端
Ui::Widget *ui;
};
#endif // WIDGET_H
TCP客户端文件clenthandler.cpp
#include "widget.h"
#include "ui_widget.h"
void Widget::initClientSignals() //初始化客户端信号槽
{
connect(&m_client, SIGNAL(connected()), this, SLOT(onClientConnected()));
connect(&m_client, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()));
connect(&m_client, SIGNAL(readyRead()), this, SLOT(onClientDataReady()));
connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onClientBytesWritten(qint64)));
connect(&m_client, SIGNAL(error(QAbstractSocket::SocketError )), this, SLOT(onClientErr(QAbstractSocket::SocketError)));
}
bool Widget::startClient() //启动客户端
{
//QString ip = QString("%1.%2.%3.%4").arg(ui->ipAddr1->text()).arg(ui->ipAddr2->text()).arg(ui->ipAddr3->text()).arg(ui->ipAddr4->text());
QString ip =ui->lineEdit_ip->text();
qDebug()<<ip;
m_client.connectToHost(ip, ui->lineEdit_port->text().toInt());
if(m_client.waitForConnected(800))
{
return true;
}
else
{
QMessageBox::information(this,"提示",QString("TCP客户端链接服务端连接超时"),QMessageBox::Ok);
return false;
}
}
void Widget::onClientConnected()
{
startConnect(true);
QMessageBox::information(this,"提示","TCP客户端链接服务端连接成功",QMessageBox::Ok);
ui->localPort->setText(QString("%1").arg(m_client.localPort())); //显示本地端口号
}
void Widget::onClientDisconnected()
{
startConnect(false);
QMessageBox::information(this,"提示","TCP客户端链接服务端断开完成",QMessageBox::Ok);
}
void Widget::onClientDataReady()
{
if(m_client.peerAddress().toString()!=targetAddr || m_client.peerPort()!=targetPort )
{
targetAddr = m_client.peerAddress().toString();
targetPort = m_client.peerPort();
ui->textEdit->insertPlainText("[接受来自"+ targetAddr+":"+QString("%1").arg(targetPort)+"]:\r\n");
}
ui->textEdit->moveCursor(QTextCursor::End);
if(ui->radioButton_receive->isChecked()) //十六进制接收?
{
QByteArray data = m_client.readAll();
for(int i=0;i<data.length();i++)
{
ui->textEdit->insertPlainText(QString("%1 ").arg((unsigned char)data[i],2,16,QChar('0')).toUpper());
}
ui->textEdit->insertPlainText("\r\n");
}
else
ui->textEdit->insertPlainText(QString::fromLocal8Bit(m_client.readAll())+"\r\n");
}
void Widget::onClientBytesWritten(qint64 bytes)
{
qDebug() << "onBytesWritten:" << bytes;
ui->sendLenLabel->setText(QString("%1").arg(ui->sendLenLabel->text().toInt()+bytes));
}
void Widget::onClientErr(QAbstractSocket::SocketError socketError)
{
qDebug()<<"onClientErr:"<<socketError;
m_client.close();
startConnect(false);
QMessageBox::information(this,"提示",QString("TCP客户端链接服务端连接失败:%1").arg((int)socketError),QMessageBox::Ok);
}
TCP服务端serverhandler.cpp
#include "widget.h"
#include "ui_widget.h"
void Widget::initServerSignals() //初始化信号槽
{
connect(&m_server, SIGNAL(newConnection()), this, SLOT(onServerNewConnection()));
}
bool Widget::startServer() //启动服务器
{
if(m_server.listen(QHostAddress::AnyIPv4,ui->lineEdit_port->text().toInt())) //只监听IPV4的所有客户端
{
ui->targetLabel->show();
ui->targetObject_ALL->show();
ui->localPort->setText(QString("%1").arg(m_server.serverPort()));
return true;
}
else
return false;
}
void Widget::onServerNewConnection()
{
qDebug() << "onNewConnection";
QTcpSocket* tcp = m_server.nextPendingConnection(); //获取新的客户端信息
QString info=tcp->peerAddress().toString()+":"+QString("%1").arg(tcp->peerPort());
ui->targetObject_ALL->addItem(info);
QMessageBox::information(this,"提示",QString("新的客户端连入:%1").arg(info),QMessageBox::Ok);
tcp->setObjectName(info); //设置名称,方便查找
connect(tcp, SIGNAL(connected()), this, SLOT(onServerConnected()));
connect(tcp, SIGNAL(disconnected()), this, SLOT(onServerDisconnected()));
connect(tcp, SIGNAL(readyRead()), this, SLOT(onServerDataReady()));
connect(tcp, SIGNAL(bytesWritten(qint64)), this, SLOT(onServerBytesWritten(qint64)));
}
void Widget::onServerConnected()
{
}
void Widget::onServerDisconnected()
{
QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(sender());
if( tcp != NULL ) //从连接对象中移除掉
{
qDebug() << "onServerDisconnected";
qDebug() << "Local Address:" << tcp->peerAddress();
qDebug() << "Local Port:" << tcp->peerPort();
QString info=tcp->peerAddress().toString()+":"+QString("%1").arg(tcp->peerPort());
QMessageBox::information(this,"提示",QString("客户端断开连接:%1").arg(info),QMessageBox::Ok);
int index = ui-> targetObject_ALL ->findText(info);
if(index>=0)
ui->targetObject_ALL->removeItem(index);
}
}
void Widget::onServerDataReady()
{
QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(sender());
if(tcp->peerAddress().toString()!=targetAddr || tcp->peerPort()!=targetPort )
{
targetAddr = tcp->peerAddress().toString();
targetPort = tcp->peerPort();
ui->textEdit->insertPlainText("[接受来自"+ targetAddr+":"+QString("%1").arg(targetPort)+"]:\r\n");
}
ui->textEdit->moveCursor(QTextCursor::End);
if(ui->radioButton_receive->isChecked()) //十六进制接收?
{
QByteArray data = tcp->readAll();
for(int i=0;i<data.length();i++)
{
ui->textEdit->insertPlainText(QString("%1 ").arg((unsigned char)data[i],2,16,QChar('0')).toUpper());
}
ui->textEdit->insertPlainText("\r\n");
}
else
ui->textEdit->insertPlainText(QString::fromLocal8Bit(tcp->readAll())+"\r\n");
}
void Widget::onServerBytesWritten(qint64 bytes)
{
qDebug() << "onBytesWritten:" << bytes;
ui->sendLenLabel->setText(QString("%1").arg(ui->sendLenLabel->text().toInt()+bytes));
}
UDP文件
#include "widget.h"
#include "ui_widget.h"
//语法错误UdpSocket = new QUdpSocket(this);
void Widget::initudpSignals() //初始化udp客户端信号槽
{
connect(&Udp_Socket, SIGNAL(connected()), this, SLOT(onudpConnected()));
connect(&Udp_Socket, SIGNAL(disconnected()), this, SLOT(onudpDisconnected()));
connect(&Udp_Socket, SIGNAL(readyRead()), this, SLOT(onudpDataReady()));//readyRead()每个新数据来的时候出发
connect(&Udp_Socket, SIGNAL(bytesWritten(qint64)), this, SLOT(onudpBytesWritten(qint64)));
connect(&Udp_Socket, SIGNAL(error(QAbstractSocket::SocketError )), this, SLOT(onudpErr(QAbstractSocket::SocketError)));
}
bool Widget::startudpClient() //启动客户端
{
Udp_Socket.bind(QHostAddress::AnyIPv4,ui->lineEdit_port_2->text().toInt());//绑定输入的端口
//QString ip = QString("%1.%2.%3.%4").arg(ui->ipAddr1->text()).arg(ui->ipAddr2->text()).arg(ui->ipAddr3->text()).arg(ui->ipAddr4->text());
QString ip =ui->lineEdit_ip->text();
int port =ui->lineEdit_port->text().toInt();
qDebug()<<ip<<port<< "远程UDP服务器链接成功";
Udp_Socket.connectToHost(ip, port);
if(Udp_Socket.waitForConnected(800))
{
return true;
}
else
{
QMessageBox::information(this,"提示",QString("UDP连接超时"),QMessageBox::Ok);
return false;
}
}
void Widget::onudpConnected()
{
startConnect(true);
QMessageBox::information(this,"提示","UDP连接成功",QMessageBox::Ok);
ui->localPort->setText(QString("%1").arg(Udp_Socket.localPort())); //显示本地端口号
// qDebug()<<"绑定成功"<<ui->lineEdit_port_2->text().toInt();
}
void Widget::onudpDisconnected()
{
startConnect(false);
QMessageBox::information(this,"提示","UDP断开完成",QMessageBox::Ok);
}
void Widget::onudpDataReady()
{
// if(Udp_Socket.peerAddress().toString()!=targetAddr || Udp_Socket.peerPort()!=targetPort )
// {
// targetAddr = Udp_Socket.peerAddress().toString();
// targetPort = Udp_Socket.peerPort();
// ui->textEdit->insertPlainText("[接受来自"+ targetAddr+":"+QString("%1").arg(targetPort)+"]:\r\n");
// }
// ui->textEdit->moveCursor(QTextCursor::End);
// if(ui->radioButton_receive->isChecked()) //十六进制接收?
// {
// QByteArray data = Udp_Socket.readAll();
// for(int i=0;i<data.length();i++)
// {
// ui->textEdit->insertPlainText(QString("%1 ").arg((unsigned char)data[i],2,16,QChar('0')).toUpper());
// }
// ui->textEdit->insertPlainText("\r\n");
// }
// else
// ui->textEdit->insertPlainText(QString::fromLocal8Bit(Udp_Socket.readAll())+"\r\n");
//读取对方发送的内容
char buf[1024] = {0}; //内容
QHostAddress cliAddr; //对方地址
quint16 port; //对方端口
qint64 len = Udp_Socket.readDatagram(buf,sizeof(buf),&cliAddr,&port);
QTime cur_time = QTime::currentTime();
QString time_info = cur_time.toString("hh:mm:ss");
if(len >0)
{
//获取到文本格式化 [192.168.1.1 : 8888]aaaa
QString str = QString("[%1:%2] %3 [%4]")
.arg(cliAddr.toString())
.arg(port)
.arg(buf)
.arg(time_info);
//ui->textEditShow->setText(str);
ui->textEdit->append(str);
}
}
void Widget::onudpBytesWritten(qint64 bytes)
{
qDebug() << "onBytesWritten:" << bytes;
ui->sendLenLabel->setText(QString("%1").arg(ui->sendLenLabel->text().toInt()+bytes));
}
void Widget::onudpErr(QAbstractSocket::SocketError socketError)
{
qDebug()<<"onClientErr:"<<socketError;
Udp_Socket.close();
startConnect(false);
QMessageBox::information(this,"提示",QString("UDP连接失败:%1").arg((int)socketError),QMessageBox::Ok);
}