您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt]UDP客户端详解

  • WangYe
  • 2020-09-13 18:16:51
  • 282 次阅读
详细解析Qt中UDP的编程步骤

环境:

    Qt 5.14.2

    Windows10


项目文件夹:

    QtSocket

image.png


控件(objectName):   

    1. 连接服务器(connectServerBtn)

    2. 发送消息(pushButton)

    3. 服务端ip编辑框(IPLineEdit)

    4. 端口编辑框(PortLineEdit)

    5. 发送内容编辑框(sendTextEdit)

    6. 接收数据编辑框(recvTextEdit)


步骤如下:

1. 在 QtSocket.pro 添加 

QT       += network

2. widget.h 内容如下

#ifndef WIDGET_H#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
#include <QMessageBox>
#include <QHostAddress>
#include <QTime>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connectServerBtn_clicked(); //连接服务器按钮

    void on_pushButton_clicked();   //发送数据按钮

    void ClientRecvData();  //读取数据编辑框

//    void ByteToHexString(QString &str,QByteArray &ba);//字节数组转16进制字符串

private:
    Ui::Widget *ui;

    QUdpSocket *mp_clientSocket;
    QUdpSocket *clientudp;
};
#endif // WIDGET_H

3. main.cpp 内容如下

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

4. widget.cpp 内容如下

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
    mp_clientSocket->close();
}

/*连接服务器*/
void Widget::on_connectServerBtn_clicked()
{
    mp_clientSocket = new QUdpSocket();
    quint16 port=ui->PortLineEdit->text().toUShort();
    QHostAddress ip(ui->IPLineEdit->text());
    //bind 本地端口
    mp_clientSocket->bind(5555);
    //监听
    mp_clientSocket->connectToHost(ip, port);
    connect(mp_clientSocket, SIGNAL(readyRead()), this, SLOT(ClientRecvData()));
     //链接成功发送
     mp_clientSocket->write("Hello UDP~");
}

/*发送数据*/
void Widget::on_pushButton_clicked()
{
    QString sendMsg = ui->sendTextEdit->toPlainText();
    char sendMsgChar[1024] = {0};
    strcpy_s(sendMsgChar, sendMsg.toStdString().c_str());
    int sendRe = mp_clientSocket->write(sendMsgChar, strlen(sendMsgChar));
    if(sendRe == -1)
    {
         QMessageBox::information(this, "QT网络通信", "向服务端发送数据失败!");
         return;
    }

}

/*接收数据*/
void Widget::ClientRecvData()
{
    /*接收Hex方法0(可用)*/
    QByteArray ba;
    while(mp_clientSocket->hasPendingDatagrams())
    {
        ba.resize(mp_clientSocket->pendingDatagramSize());
        mp_clientSocket->readDatagram(ba.data(), ba.size());
        ui->recvTextEdit->insertPlainText(ba);
        qDebug() << ba ;
    }
    /*接收Hex方法1*/
//    QByteArray datagram;
//    while(mp_clientSocket->hasPendingDatagrams())
//    {
//        //等待接收的字节数
//        int sizeLen=static_cast<int>(mp_clientSocket->pendingDatagramSize());
//        datagram.resize(sizeLen);
//        //读取
//        mp_clientSocket->readDatagram(datagram.data(),datagram.size());
//        QString data;
//        this->ByteToHexString(data,datagram);
//        ui->recvTextEdit->insertPlainText(data);
//        ui->recvTextEdit->moveCursor(QTextCursor::End);
//        qDebug() << data;
//    }
    /*接收Hex方法2*/
//    while(mp_clientSocket->hasPendingDatagrams())
//    {
//        QByteArray byte = mp_clientSocket->readAll().toHex();

//        qDebug() << byte ;

//        ui->recvTextEdit->insertPlainText(byte);
//    }
}

//字节数组转16进制字符串
//void Widget::ByteToHexString(QString &str, QByteArray &ba)
//{
//    str= ba.toHex();//直接转换中间没有空格
//    for (int i = 0; i < ba.length(); i++)
//    {
//        unsigned char n =static_cast<unsigned char>((ba.at(i)));
//        QString nhex = QByteArray::number(n, 16).toUpper();
//        str.append(nhex);
//        str.append(' ');//字节间加空格
//    }
//}

效果如下:

1599992714592151.png

文章评论 (0)



Top