QT-UDP网络编程
QT_UDP网络编程
用户数据报协议(UDP,User Datagram Protocol );
轻量的,不可靠,无连接,面向数据报的传输协议
与TCP,特征:
UDP通信在本质上不需要区分客户端和服务端,拥有socket的一方本身具有发送和接收数据报的能力.
QUdpSocket继承于父类的QAbstractSocket,没有QTcpSocket的流功能函数
在通信方式上不同于TCP的连接,UDP通信分为单播,广播,组播.
单播与建立连接的TCP的一对端类似,是一对一的通信,需要知晓双方的网络ip和port才能交换数据.
广播在同一互联网域(一般为局域网)内,当绑定的ip内有广播数据报,所有端都可以接收数据报内容.
组播类似群聊,在互联网域内进行分组,只有同一个分组的端能够发送和接收数据报内容.
连接方式/步骤:
//进入UDP通信环节的整体步骤
{
QUdpsocket *udpsocket = new QUdpsocket(this); //创建已窗体类本身为父类的socket
connect(udpsocket,&QUdpsocket::stateChanged,this,&MainWindow::do_stateChanged); //绑定该socket与窗体类状态改变信号的槽函数
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(do_socketReadyRead())); //readyRead信号在socket确认有数据传入时发送,绑定do_socketReadyRead函数处理
}
{
//绑定该客户端窗口监听的本地端口号
udpsocket->bind(port);
//本地客户端解绑方式
udpsocket->absort();
}
{
//单播方式的消息发送流程
QHostAddress targetAddress(targetIP); //目标通信对象的IP地址(QString)转换为QHostAddress格式
QByteArray msg_to_send = msg.toUtf8(); //需要交换的数据报信息,此处为字符信息,转换为utf8的bytearray
udpsocket.writeDatagram(msg_to_send,targetAddress,targetPort); //socket单播方式发送数据报
}
{
//广播方式的消息发送流程
QByteArray msg_to_send = msg.toUtf8();
udpsocket.writeDatagram(msg_to_send,QHostAddress::Broadcast,targetPort); //socket广播方式发送数据报,无需指定targetAddress
}
do_ReadyRead
{
//单播与广播的消息接收流程
while(udpsocket->hasPendingDatagram())
{
QByteArray datagram; //创建数据接收载体
datagram.resize(udpsocket->pendingDatagramSize()); //根据数据大小调整载体大小
QHostAddress peerAddr; //对方地址
quint16 peerPort; //对方端口
udpsocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort); //指定必需的数据内容存放处及其大小供写入,接收可选参数对方地址和端口.
QString data = datagram.data(); //获取存放的信息数据
}
}
//省略 do_stateChanged() 函数编写部分
//组播方式变更的地方
{
udpsocket = new QUdpsocket(this);
//↓
udpsocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);//设置udp通信方式为组播且ttl(生存周期)为一个路由器跳转内,实现局域网组播通信
//加入组播的方式
if(udpsocket->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress))//绑定局域网内任何IPv4协议的网络地址,port为组播的统一端口,ShareAddress允许其他服务使用这个地址和端口,是该模式下mode的必填项
{
udpsocket->joinMulticastGroup(groupAddress); //加入组播组
udpsocket->leaveMulticastGroup(groupAddress); //离开组播组
}
//发送信息的参数填写
udpsocket->writeDatagram(datagram,groupAddress,groupPort);
//读取信息代码与单播和广播一致
}
与TCP相同的信号绑定部分,总体来说先学习UDP通信会更便于理解TCP连接通信