Qt+UDP及封裝

1、單播服務器

一、聲明udp對象socket

QUdpSocket* udpClient;tcp

二、new出對象函數

udpClient = new QUdpSocket(this);ui

三、分配本地地址(若是不分配,使用系統自動分配的),設置接收槽函數this

udpClient.bind("192.168.1.1」,8080);spa

QObject::connect(this->udpClient,SIGNAL(readyRead()),this,SLOT(rcvData()));code

四、接收函數對象

void Udp::rcvData()blog

{

  if(this->udpClient->pendingDatagramSize() == 0)

    return;

  QByteArray ba;

  ba.resize(udpClient->pendingDatagramSize());

  QHostAddress tempHost("");

  quint16 port = 0;

  this->udpClient->readDatagram(ba.data(),udpClient->pendingDatagramSize(),&tempHost,&port);

}

五、發送

void Udp::on_pushButton_3_clicked()

{

 

  if(j == this->udpClient->writeDatagram(tempChar,j,ipAddress,port))

  {

    qDebuf()<<"發送成功"

  }

}

六、關閉

udpClient.close();

 

ps:一、udp套接字bind成功以後,狀態是BoundState,close以後是UnconnectedState;

   二、bind是將一個ip和地址綁定,並使socket與這兩個綁定在一塊兒,一般是udp使用此函數;connectToHost是套接字鏈接至主機ip和端口,一般是tcp客戶端鏈接至服務器使用此函數;

   三、每當udp的readyRead信號發出來後,必定要使用接收函數把數據接收了,不然下次來數據的時候不會發出此信號。

2、組播

組播:假設一個局域網內有多個計算機,每一個計算機有一個IP,定義一個組播IP,把局域網中的某些計算機加入此組播IP,而後發送端向這個組播IP發送數據就完成了組播過程。

3、廣播

向255:255:255:255發送

 

 

ps:路由器會過濾多播(組播和廣播)

PS:開發流程

 

4、封裝

頭文件

#ifndef DATAACCESS_H
#define DATAACCESS_H
/*****************************************************************/
//做者:NULL
//函數名稱:數據通訊
//函數參數:NULL
//函數返回值:NULL
//函數做用:NULL
//備註:NULL
/*****************************************************************/
#include <QObject>
#include <QUdpSocket>
class DataAccess : public QObject
{
    Q_OBJECT
private:
    QUdpSocket* udp;
public:
    explicit DataAccess(QObject *parent = nullptr);
    ~DataAccess();
    void init();
signals:
    void initSignal();
    void sendDataSignal(const QByteArray&);
public slots:
    void initSlot();
    void rcvDataSlot();
};

#endif // DATAACCESS_H

源文件

#include "dataaccess.h"
#include "includes.h"
#include "config.h"
#include "mymethod.h"
/*****************************************************************/
//做者:朱小勇
//函數名稱:構造函數
//函數參數:NULL
//函數返回值:NULL
//函數做用:NULL
//備註:NULL
/*****************************************************************/
DataAccess::DataAccess(QObject *parent) : QObject(parent)
{
    udp = NULL;
}

/*****************************************************************/
//做者:朱小勇
//函數名稱:初始化
//函數參數:NULL
//函數返回值:NULL
//函數做用:綁定udp端口
//備註:NULL
/*****************************************************************/
void DataAccess::init()
{
    QObject::connect(this,SIGNAL(initSignal()),this,SLOT(initSlot()));
    emit initSignal();
}

/*****************************************************************/
//做者:朱小勇
//函數名稱:析構函數
//函數參數:NULL
//函數返回值:NULL
//函數做用:NULL
//備註:NULL
/*****************************************************************/
DataAccess::~DataAccess()
{
    if(NULL!=udp)
    {
        delete udp;
        udp->close();
        udp = NULL;
    }
}

/*****************************************************************/
//做者:朱小勇
//函數名稱:初始化
//函數參數:NULL
//函數返回值:NULL
//函數做用:NULL
//備註:NULL
/*****************************************************************/
void DataAccess::initSlot()
{
    RET_IF_NOT_EAQU(udp,NULL);

    udp = new QUdpSocket();
    bool ret = udp->bind(QHostAddress(Config::getInstance()->sets->value(LOCAL_UDP_IP).toString()),Config::getInstance()->sets->value(LOCAL_UDP_PORT).toUInt());
    record<QString>(Config::getInstance()->sets->value(LOCAL_UDP_IP).toString());
    record<uint>(Config::getInstance()->sets->value(LOCAL_UDP_PORT).toUInt());
    record<bool>(ret);
    QObject::connect(udp,SIGNAL(readyRead()),this,SLOT(rcvDataSlot()));
}

/*****************************************************************/
//做者:朱小勇
//函數名稱:數據接收
//函數參數:NULL
//函數返回值:NULL
//函數做用:NULL
//備註:NULL
/*****************************************************************/
void DataAccess::rcvDataSlot()
{
    record<QString>("rcvDataSlot");
    RET_IF_EAQU(udp->pendingDatagramSize(),VALUE_ZERO);
    QByteArray ba;
    ba.resize(udp->pendingDatagramSize());
    QHostAddress tempHost("");
    quint16 port = VALUE_ZERO;
    udp->readDatagram(ba.data(),udp->pendingDatagramSize(),&tempHost,&port);
    record<QString>(ba.toHex().toUpper());
}
相關文章
相關標籤/搜索