一、UDP的特点
UDP(用户数据报协议)是一种简单轻量级、不可靠的、面向数据报,无连接的传输层协议。而TCP/IP协议却是有连接的
二、UDP适合应用的几种情况
1、网络数据大多为短消息
2、拥有大量客户端
3、对数据安全性无特殊要求
4、网络负担非常重,但对响应速度要求高。
三、Qt中使用UDP通信
因为UDP是无连接的,所以两个通信设备利用UDP通信不需要建立连接,只需要知道对方的地址和端口号即可
添加网络模块
QT += network;
添加头文件
#include<QUdpSocket>
端口
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。计算机共有65535个端口,但一般0~1024号端口都是被系统占用的,所以我们绑定端口号时记得使用1024~65535之间的端口号
绑定端口
udpsocket->bind(9000); //绑定端口号
发送数据
writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
参数介绍
1.发送的数据
2.发送数据的长度(可以省略)
3.对方的IP地址
4.对方的端口号
QString text = ui->te_input->toPlainText();
udpsocket->writeDatagram(text.toUtf8(),QHostAddress(IP),PORT);
获取用户编辑的文本信息,使用writeDatagram()发送
接收数据
readDatagram(char *data, qint64 maxSize, QHostAddress *address = nullptr, quint16 *port = nullptr)
参数介绍
1.将socket读取的数据放入到data中
2.读取的长度
3.对方的IP地址
4.对方的端口号
当socket接收到数据时,会自动触发readyRead信号,然后我们可以处理这个信号,接收对方发过来的信息
connect(udpsockets,&QUdpSocket::readyRead,[=]
{
QByteArray arry;
arry.resize(udpsockets->pendingDatagramSize());//获取数据报的长度
QHostAddress cliaddr = QHostAddress("127.0.0.1"); //对方的IP
quint16 port = 9000; //对方的端口号
qint64 len = udpsockets->readDatagram(arry.data(),arry.size(),&cliaddr,&port);
if(len>0)
{
ui->textEdit->append(arry.data());
}
});
为了区分两个设备,我这里建了两个工程,一个发送端,一个接收端
两个设备之间可以互相接收和发送数据,原理是一样的