我正在尝试通过QTCPsocket发送图片,使用localhost(127.0.0.1)它可以正常工作。 如果我通过以太网将其发送到其他PC,有时Qt会将其重新发送2次,请参阅调试输出。
我该如何解决?
服务器端:
void server::writePic(QString fileName)
{
name = QString("%1.png").arg(counter);
counter++;
qDebug() << name;
pic.load(fileName, "PNG");
pic.setText("name",name);
pic.setText("datum","20-3-2018");
QByteArray ba; // Construct a QByteArray object
QBuffer buffer(&ba); // Construct a QBuffer object using the QbyteArray
pic.save(&buffer, "PNG"); // Save the QImage data into the QBuffer
qDebug() << ba;
socket->flush();
socket->write(ba); // Send the QBuffer (QbyteArray) over a socket
socket->waitForBytesWritten();
socket->flush();
}
客户方:
void Client:: readyRead()
{
ImageBuffer->open(QIODevice::ReadWrite);
socket->waitForReadyRead(1);
QByteArray Temp;
Temp = socket->readAll();
ImageBuffer->write(Temp);
pic.loadFromData(ImageBuffer->buffer());
std::stringstream fileName;
fileName <<"C:/pics/" << pic.text("name").toStdString();
if(!pic.isNull())
{
qDebug() << "Image file was received ";
qDebug() << pic.text("name");
qDebug() << pic.text("datum");
qDebug() << "size = " << Temp.size();
pic.save(fileName.str().c_str(),"PNG");
}else{
qDebug() << "Pic is NULL";
qDebug() << "size = " << Temp.size();
}
}
服务器端:
"C:/.../Analysis/test_images/Foto01.png"
"1.png"
We wrote: 25156
File has been removed
"C:/.../Analysis/test_images/Foto02.png"
"2.png"
We wrote: 26755
File has been removed
客户方:
没有成功:
Pic is NULL
size = 18980
Pic is NULL
size = 6176
成功:
Image file was received
"2.png"
"20-3-2018"
size = 26755
答案 0 :(得分:0)
没有什么能确保您在一次阅读中收到您的照片。确实如此。一种解决方案是将您的图片封装在您将定义的框架中,其中包含有关该图片的信息。 一种简单(而不是真正的防弹)方式是将图片的大小添加为帧的前4个字节。 在接收方,您可以阅读它,并等待其他数据,只要您没有接收到预期的一方。 当然,您应该改进结构和处理以处理数据包丢失和虚假断开。