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()); }