Я пытаюсь отправить изображения через QTCPsocket, с localhost (127.0.0.1) он работает нормально.
Если я отправляю его на другой компьютер через Ethernet, иногда 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
Ничто не гарантирует, что вы получите свою фотографию в одно чтение. Это правда. Одним из решений является инкапсуляция вашей картинки в определенный вами кадр, содержащий информацию об этой картинке.
Один простой (и не очень пуленепробиваемый) способ — добавить размер вашей картинки в качестве первых 4 байтов кадра.
На приемной стороне вы можете прочитать его и ждать дополнительных данных, пока вы не получили или не получили в аренду ожидаемую сторону.
Конечно, вы должны улучшить структуру и обработку для обработки потери пакетов и ложных отключений.
Других решений пока нет …