首頁 > 軟體

Qt實現簡單UDP通訊

2022-08-18 18:03:49

Qt簡單實現UDP通訊的具體程式碼,供大家參考,具體內容如下

標籤(空格分隔): udp通訊、Qt

一、UDP簡介

1)UDP(User Datagram Protocol,使用者資料包協定)

UDP是一個輕量級、不可靠、面向資料包的、無連線的傳輸層協定,多用於可靠性要求不嚴格,不是非常重要的傳輸,如直播、視訊會議等等。

2)Qt中QUdpSocket類繼承自QAbstractSocket,用來傳送和接收UDP資料包,”Socket”即通訊端,通訊端即IP地址+埠號。其中IP地址指定了網路中的一臺主機,二埠號則指定了該主機上的一個應用程式,埠號只具有本地意義,使用通訊端即可實現網路上的兩個應用程式之間的通訊。

3)QUdpSocket支援IPv4廣播,要廣播資料包,則只需傳送到一個特殊的地址QHostAddress::Broadcast(即255.255.255.255),資料包一般建議傳送位元組數小於512位元組。埠號選擇1024-65535(1024以下的常用作保留埠號,如FTP常用埠號21,Telnet常用埠號23,DNS域名伺服器常用埠53等)。

二、具體Demo

傳送端:

  • 新建Qt Widgets Application,用作udp傳送端,繼承自Qwidget類即可,設計ui介面,用於傳送資訊,介面如下:

  • 開啟pro檔案,做如下修改,支援網路程式設計,接收端也需做如下修改

  • 新增傳送端udpSocket以及按鈕的點選訊號
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
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_pushButton_clicked();   //按鈕點選訊號

private:
    Ui::Widget *ui;
    QUdpSocket* m_sender;   //udp傳送端
};
#endif // WIDGET_H
  • 點選訊號對應槽函數的實現:
#include "widget.h"
#include "ui_widget.h"

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

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    QByteArray dataGram=ui->lineEdit->text().toUtf8();
    m_sender->writeDatagram(dataGram.data(),
                            dataGram.size(),
                            QHostAddress::Broadcast,    //udp廣播地址
                            6666);
}

接受端:

  • 再新建Qt Widgets Application專案,用作udp接收端,繼承自Qwidget類即可,設計ui介面,用標籤部件來顯示接收到的資訊,介面如下:

  • 跟傳送端一樣,在pro檔案中新增支援網路程式設計的模組 network
  • 新增接收端udpSocket,如下:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
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 processData();
private:
    Ui::Widget *ui;
    QUdpSocket* m_receiver; //udp接受端
};
#endif // WIDGET_H
  • 編輯接收端原始檔:
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_receiver=new QUdpSocket(this);
    //繫結傳送端,ShareAddress允許多接收端繫結6666埠
    m_receiver->bind(6666,QUdpSocket::ShareAddress);
    //當接收端接收到資料時,就會傳送readRead訊號
    connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::processData);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::processData()
{
    QString strData;
    //有未處理的資料包
    while(m_receiver->hasPendingDatagrams()){
        QByteArray dataGram;
        //讀取的資料包大小
        dataGram.resize(m_receiver->pendingDatagramSize());
        m_receiver->readDatagram(dataGram.data(),dataGram.size());
        ui->dataLabel->setText(dataGram);   //將接收到的資料顯示到標籤上
    }

}

三、執行效果

  • 執行傳送端應用程式,再開啟接收端應用程式;
  • 在傳送端編輯框輸入資料,點選廣播,觀察接收端的情況,結果如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com