目录
一、UDP通信
发送的是数据报, 数据报接收顺序与发送顺序可以不一致,
实时性强,数据安全得不到保证
应用(视频传输, 视频会议, 音频传输)
1.Qt中udp通信QUdpSocket
(1)发送端:
①创建QUdpSocket对象
QUdpSocket msocket;
②调用对象方法发送数据writeDatagram
msocket.writeDatagram(data.toUtf8(),QHostAddress(ip), port.toUShort());
(2)接收端:
①创建QUdpSocket对象
QUdpSocket msocket;
②绑定
msocket.bind(QHostAddress::AnyIPv4, port.toUShort());
③当QUdpSocket对象有数据可读的时候会发送readyRead信号 (发送者, 什么时候, 槽函数)
connect(&msocket, &QUdpSocket::readyRead,this, &UdpRecv::read_data);
④在信号关联的槽函数中调用对象方法接收数据readDatagram
char array[1024]={0};//保存数据
msocket.readDatagram(array, 1024);
2.Udp通信广播
192.168.1.255 组播224.0.0.0
(1)app端UdpApp
①创建QUdpSocket对象
QUdpSocket msocket;
②发送广播 -> (端口要预先与控制器固定9999)
msocket.writeDatagram(data.toUtf8(),QHostAddress(广播地址), 9999);
③接收到控制器反馈ip -> 当msock有数据可读的时候会发送readyRead信号
connect(&msocket,&QUdpSocket::readyRead,this,&AppWin::get_ip);
(2)控制器端UdpControl
①创建QUdpSocket
QUdpSocket msocket;
②绑定地址(端口号预先与app固定9999)
msocket.bind(QHostAddress::AnyIPv4, port.toUShort());
③接收广播数据–反馈控制器ip地址(当QUdpSocket对象有数据可读的时候会发送readyRead信号)
//关联读数据信号readyRead--接收广播数据
connect(&msocket, &QUdpSocket::readyRead, this, &UdpControl::recv_broadcast);
QHostAddress appaddr;
quint16 port;
QByteArray array; //要另外分配空间
qint64 size = msocket.bytesAvailable();//获取当前有多少字节数据可读
array.resize(size);//分配空间
msocket.readDatagram(array.data(),array.size(),&appaddr, &port);
//给发送方回馈数据--给app端发送数据
msocket.writeDatagram("ip",3, appaddr, port);
3.Udp通信组播
224.0.0.0 ---- 239.255.255.255
(1)组播发送端:
①创建QUdpSocket
QUdpSocket msocket;
②发送数据到组播地址
msocket.writeDatagram(data.toUtf8(),//要发送的数据
QHostAddress(ui->ipEdit->text()),//组播地址
ui->portEdit->text().toUShort());//端口号
(2)组播接收端:
①创建QUdpSocket
QUdpSocket msocket;
②绑定
msocket.bind(QHostAddress::AnyIPv4, port.toUShort());
③在槽函数中读取数据 -----当QUdpSocket对象有数据可读的时候会发送readyRead信号)
connect(&msocket, &QUdpSocket::readyRead, this, &MultiCastRecv::recv_multicast);
QHostAddress appaddr;
quint16 port;
QByteArray array; //要另外分配空间
qint64 size = msocket.bytesAvailable();//获取当前有多少字节数据可读
array.resize(size);//分配空间
msocket.readDatagram(array.data(),array.size(),&appaddr, &port);
//给发送方回馈数据--给app端发送数据
msocket.writeDatagram("ip",3, appaddr, port);
(3)如果要接收组播数据
添加到组播组
//获取组播地址
QString multiAddress = ui->ipEdit->text();
//加入组播组
if(msocket.joinMulticastGroup(QHostAddress(multiAddress)))
{
//把地址添加到列表中去
ui->listWidget->addItem(multiAddress);
}
else
{
qDebug()<<"加入失败";
}
(4)如果不想接收组播数据
离开组播组
QString multiAddress = item->text();
if(msocket.leaveMulticastGroup(QHostAddress(multiAddress)))
{
delete item;
}
else
{
qDebug()<<"退出失败";
}