我的QT学习之路,编写UDP+tcp网络调试助手

作者: lhlaishui 分类: QT 发布时间: 2021-03-30 17:40

我的一名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);
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注