QT - 創建UDP Socket通信

 

1、UDP概述

            相對與TCP通信,UDP通信是面向無連接的,也即服務器端與客戶端不需要建立連接即可發送接收數據。

           UDP的通信特點:簡單輕便、不可靠、面向數據報、無連接的傳輸協議,可以應用在可靠性不是十分重要的場合,如短消息、廣播消息等。

         適合應用的情況有以下幾種:

         1、網絡數據大多爲短消息;

         2、擁有大量客戶端;

         3、對數據安全性無特殊要求;

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

2、UDP通信

         一般在UDP通信中,不存在嚴格意義上的服務器端、客戶端,因爲不需要建立連接,可以理解爲發送端、接收端。發送端向指定端口發送數據,接收端從指定端口讀取數據,反之亦然。

        爲了實現發送端與接收端的雙向通信,在每一端需要定義兩個端口:發送數據端口、接收數據端口,具體組成如下所示:

 

       上圖可以看出,發送端將數據發送到指定的發送端口,接收端從制定的接收端口接收數據,這兩個端口必須保持一致。反之亦然。

3、通信流程

1)、發送端流程

a、初始化套接字:udpSender = new QUdpSocket();

b、配置發送端口:int sendPort = 1234;

c、配置接收端口:int recvPort = 4321;

d、綁定接收端口:udpSender->bind(recvPort);

e、發送數據:udpSender->wrtiteDatagram();

f、等待接收數據:通過信號SIGNAL(readyRead())觸發接收槽函數,通過readDatagram()函數讀取數據。

2)、接收端流程

接收端的流程與發送端基本一致,

a、初始化套接字:udpRecv = new QUdpSocket();

b、配置發送端口:int sendPort = 4321; //該發送端口需要與發送端的接收端口保持一致;

c、配置接收端口:int recvPort = 1234; //該接收端口需要與發送端的發送端口保持一致;

d、綁定接收端口:udpRecv>bind(recvPort);

e、發送數據:udpSender->wrtiteDatagram();

f、等待接收數據:通過信號SIGNAL(readyRead())觸發接收槽函數,通過readDatagram()函數讀取數據。

4、具體實現

爲了實現QT的Socket通信,需要在工程中的.pro文件中加入QT       += network

1)發送端

//初始化
udpSocket = new QUdpSocket(this); //創建UDP Socket
QString portStr = portLineEdit->text(); //發送數據的端口
port = portStr.toInt();
 
portStr = portRecvLineEdit->text(); //接收數據的端口
recvPort = portStr.toInt();
bool bindResult = udpSocket->bind(recvPort);    //接收數據時,需要將SOCKET與接收端口綁定在一起
if(!bindResult)
{
    return;
}
//connect slot
connect(sendButton, SIGNAL(clicked()), this, SLOT(sendData()));     //綁定發送
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(recvData()));    //綁定接收
 
//發送函數
sendData()
{
    QString sendStr = sendLineEdit->text();
    if(sendStr.isEmpty())
    {
        return;
    }
 
    //QHostAddress::Broadcast,指定向廣播地址發送
    int length = udpSocket->writeDatagram(sendStr.toStdString().c_str(), QHostAddress::Broadcast, port);        //向指定端口發送數據
    if(length != sendStr.length())
    {
        QMessageBox::information(this, "消息提示", "發送失敗!");
        return;
    }
}
//接收數據函數
recvData()
{
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
 
        udpSocket->readDatagram(datagram.data(), datagram.size());
        QString msg = datagram.data();
        showRecvTextEdit->insertPlainText(msg + "\n");
        //showRecvTextEdit->setText(msg);
    }
}

 

2)接收端

請參考發送端的實現,注意發送端口與接收端口的一一對應。

5、示例

以下爲示例示意圖:

訪問http://download.csdn.net/download/bailang_zhizun/10159814即可獲得該示例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章