新闻  |   论坛  |   博客  |   在线研讨会
迅为4412开发板Qt网络编程-UDP实现服务器和客户端
魔法城堡 | 2021-05-13 11:01:46    阅读:119   发布文章

UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。

udp 网络编程只需要使用一个类 QUdpSocket。

1.jpg

本实验中对 QUdpSocket 的基本使用:

1.创建 QUdpSocket 对象。

2.绑定端口号

3.数据到来触发 readyRead()信号。

4.读取发送数据。

5.关闭。

具体步骤:

步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。

2.jpg

步骤二:编写代码

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

}

3.jpg

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客