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 套接字。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
udp.h
#include
#include
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();
}
日本鬼父第二季