Qt中UDP简单使用
UDP(User Datagram Protocol,用户数据报协议)
UDP是一个轻量级、不可靠、面向数据报的、无连接的协议,多用于可靠性要求不严格,不是非常重要的传输。
QUdpSocket类继承自QAbstractSocket,用来发送和接收UDP数据报,”Socket”即套接字,套接字即IP地址+端口号。其中IP地址指定了网络中的一台主机,二端口号则指定了该主机上的一个网络程序,使用套接字即可实现网络上的两个应用程序之间的通信。
客户端:
QUdpSocket* m_sender;
m_sender=new QUdpSocket(this);
//获取用户输入的信息
//要将QString转为字符串所以调用toUtf8();
QByteArray bytGram=ui->lineEdit->text().toUtf8();
//将信息写入包中QHostAddress::Broadcast枚举值表示一广播方式
//(既所有用户都可接收到)详情可查帮助文档
//8888表示端口号,相当于指明这个电脑的那个应用程序用这个
//将需要发送的消息写到Socket中,写多少数据
m_sender->writeDatagram(bytGram,bytGram.size(),QHostAddress::Broadcast,8888);
小结:
- 首先实例化一个QUdpSocket对象。
- 然后调用writeDatagram()函数进行写数据到数据包中。
接收端:`
QUdpSocket*m_reciver;
m_reciver=new QUdpSocket(this);
//绑定(选择要接受那个端口发来的消息,和绑定的模式)
//QUdpSocket::ShareAddress这里用的共享地址,其他端口号一样的也可以和此服务端进行通信
m_reciver->bind(8888,QUdpSocket::ShareAddress);
//当服务端收到客户端发来的消息时会触发readyRead,信号
//onReciveMsg是我自定义的槽函数,用来处理从客户端接受到的消息
connect(m_reciver,&QUdpSocket::readyRead,
this,&Widget::onReciveMsg);
void Widget::onReciveMsg()
{
//hasPendingDatagrams()如果有数据包未读,返回true
while(m_reciver->hasPendingDatagrams())
{
//用字符串来接收数据包中的内容
QByteArray dataGram;
//pendingDatagramSize()返回未读数据包的大小
dataGram.resize(m_reciver->pendingDatagramSize());
//将数据读写到dataGram中,并指定要读多少的是数据
m_reciver->readDatagram(dataGram.data(),dataGram.size());
ui->label->setText(dataGram);
}
}
小结:
- 首先实例化一个QUdpSocket对象
- 调用bind()进行绑定
- 当客户端有数据包需要读时会触发QUdpSocket::readyRead,信号,接下来进行readDatagram()读数据。