UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。
udp 网络编程只需要使用一个类 QUdpSocket。
本实验中对 QUdpSocket 的基本使用:
1.创建 QUdpSocket 对象。
2.绑定端口号
3.数据到来触发 readyRead()信号。
4.读取发送数据。
5.关闭。
具体步骤:
步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。
步骤二:编写代码
1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号
(),在绑定的槽函数内去读取数据。
2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长度,如果数据没有被读取
完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。
readDatagram(data,size);
参数 data 为读取的数据,size 为数据长度。
3.发送数据,使用 writeDatagram 函数,
writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);
Data:发送的数据。
Len:发送的数据长度。
Host:目标 IP 地址。
Port:目标端口号。
4.关闭 socket 套接字。
代码如下:
-
udp.h
-
#include <QMainWindow>
-
#include <QUdpSocket>
-
namespace Ui {
-
class Udp;
-
}
-
class Udp :
public QMainWindow
-
{
-
Q_OBJECT
-
public:
-
explicit Udp(QWidget *parent = 0); ~Udp();
-
QUdpSocket * udpSocket;
-
private slots:
-
void on_pushButton_clicked();
-
void readyRead_Slot(void);
-
void on_pushButton_3_clicked();
-
void on_pushButton_2_clicked();
-
private:
-
Ui::Udp *ui;
-
};
-
udp.cpp:
-
Udp::Udp(QWidget *parent) :
-
QMainWindow(parent), ui(
new Ui::Udp)
-
{
-
ui->setupUi(
this);
-
udpSocket =
new QUdpSocket(
this);
-
}
-
Udp::~Udp()
-
{
-
delete ui;
-
}
-
/*
-
* 打开按钮
-
*/
-
void Udp::on_pushButton_clicked()
-
{
-
//绑定本端口的端口号
-
if(udpSocket->bind(ui->cliEdit->text().toUInt()) ==
true){
-
QMessageBox::information(
this,
"提示",
"成功");
-
}
else{
-
QMessageBox::information(
this,
"提示",
"失败");
-
}
-
//绑定数据信号和槽函数
-
connect(udpSocket,SIGNAL(readyRead()),
this,SLOT(readyRead_Slot()));
-
}
-
/*
-
*读取数据槽函数
-
*/
-
void Udp::readyRead_Slot()
-
{
-
QString buf;
-
QByteArray
array;
-
//hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取
-
while(udpSocket->hasPendingDatagrams()){
-
//获取数据
-
array.resize(udpSocket->pendingDatagramSize());
-
udpSocket->readDatagram(
array.data(),
array.size());
-
buf =
array.data();
-
ui->recvEdit->appendPlainText(buf);
-
}
-
}
-
/*
-
* 发送数据
-
*/
-
void Udp::on_pushButton_3_clicked()
-
{
-
quint16 port;
-
QString sendBuff;
-
QHostAddress address;
-
address.setAddress(ui->ipEdit->text());
//目标机地址
-
port = ui->portEdit->text().toInt();
//目标机端口号
-
sendBuff = ui->sendEdit->text();
//发送的数据
-
//发送
-
udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);
-
}
-
/*
-
*关闭
-
*/
-
void Udp::on_pushButton_2_clicked()
-
{
-
udpSocket->close();
-
}
转载:https://blog.csdn.net/mucheni/article/details/116740458