1. 程式人生 > >Qt學習之路十二——利用UDP進行通訊

Qt學習之路十二——利用UDP進行通訊

一、UDP的特點

UDP(使用者資料報協議)是一種簡單輕量級、不可靠、面向資料報,無連線的傳輸層協議。而TCP/IP協議卻是有連線

二、UDP適合應用的幾種情況

1、網路資料大多為短訊息

2、擁有大量客戶端

3、對資料安全性無特殊要求

4、網路負擔非常重,但對響應速度要求高。

三、利用UDP進行網路通訊

因為upd是無連線的,所以兩個通訊裝置之間不需要建立連線,只要知道對方的IP地址和埠號就行了。

我們首先建立一個專案,這個專案需要用到ui介面,所以我們還是使用Qtdesigner,並且還要給它布好局。


首先我們需要繫結埠號,如果在同一臺電腦上測試IP地址可以不需要繫結,繫結的時候我們用到bind()函式。

例:

udpsocket
->bind(8000);

接收資料

當接收到資料的時候,socket會自動觸發readyRead這個訊號,所以需要寫一個參函式來處理這個訊號,也就是讀取socket接收到的資料。

接收資料的時候我們需要用到這個一個函式

readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)

這個函式的引數的含義如下

1、將讀取的內容存放在data中

2、讀取的長度

3、對方的ip地址

4、對方的埠號

最後將讀取的內容顯示在文字編輯框裡就可以了。

傳送資料

傳送資料的步驟和讀取資料的步驟差不多的,首先需要獲取介面中的埠,ip地址和文字編輯框中的內容,然後通過writeDatagram()這個函式來發送。

writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)

這個函式的引數含義如下

1、需要傳送的訊息

2、對方的IP地址

3、對方的埠號

四、傳送和接收的程式碼

傳送

void Widget::on_pushButtonwrite_clicked()
{
    //獲取對方的埠號和ip
    QString ip = ui->lineEditip->text();
    quint16 port = ui->lineEditport->text().toInt();

    //獲取文字框的內容
    QString str = ui->textEdit->toPlainText();

    //將資訊傳送給指定的ip
    udpsocket->writeDatagram(str.toUtf8(), (QHostAddress)ip, port);
}

接收

void Widget::readData()
{
    char buf[1024] = {0};
    QHostAddress addr; //對方的ip
    quint16 port; //對方的埠
    qint64 len;
    len = udpsocket->readDatagram(buf, sizeof(buf), &addr, &port);
    {
        if(len > 0)
        {
            QString str = QString("[%1:%2]  %3").arg(addr.toString()).arg(port).arg(buf);
            ui->textEdit->setText(str);
        }
    }
}

編譯執行之後如下圖


我這裡因為需要兩個視窗進行通訊,所以將另一個程式的埠號改成了8888。