UDP传数据每帧数据最大传64k,而图片文件一般远大于64K,此时就需要将图像数据分包传输,接收端也分包接收,直到整个图片数据都收到,再进行其他处理。
发送端
//发送数据
void QTUDPSend::sendData()
{
//发送到14551端口
sendPort = 14551;
//发送图片名字
_qUdpSocket->writeDatagram(imageName.toStdString().c_str(),QHostAddress(udpIP), sendPort);
qDebug() << "发送图片名称:"<< imageName;
QFile file;
file.setFileName(imagePath);
if (!file.open(QIODevice::ReadOnly)) return;
QByteArray begin = "Begin!";
_qUdpSocket->writeDatagram(begin, QHostAddress(udpIP), sendPort);
qDebug() << "发送:Begin!";
while (!file.atEnd())
{
QByteArray line = file.read(8000);
_qUdpSocket->writeDatagram(line, QHostAddress(udpIP), sendPort);
_sleep(5);//延迟5ms
if (line.size() < 8000)
{
QByteArray end = "End!";
_qUdpSocket->writeDatagram(end, QHostAddress(udpIP), sendPort);
qDebug() << "发送:End!";
}
}
}
接收端
void QTUDPRecv::recvDataSlot()
{
while (_qUdpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(_qUdpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 Pic_port;
_qUdpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &Pic_port);
qDebug() << "接收数据:"<< datagram.data();
ui.textEdit_recv->setText(datagram.data());
if (datagram == "Begin!")
{
picBuffer.clear();
}
else if (datagram == "End!")
{
showPicture();
break;
}
else
{
picBuffer.append(datagram);
}
}
}
void QTUDPRecv::showPicture()
{
QBuffer buffer(&picBuffer);
buffer.open(QIODevice::ReadOnly);
QImageReader reader(&buffer);
QImage img = reader.read();
ui.label_showImg->setPixmap(QPixmap::fromImage(img));
//充满label
ui.label_showImg->setScaledContents(true);
}