Отправка картинок через qt TCP / IP - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь отправить изображения через 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

1 Ответ

0 голосов
/ 14 мая 2018

Ничто не гарантирует, что вы получите свою фотографию в одно чтение.Это правда.Одним из решений является инкапсуляция вашей картинки в определенный вами кадр, содержащий информацию об этой картинке.Один простой (и не очень пуленепробиваемый) способ - добавить размер вашей картинки в качестве первых 4 байтов кадра.На принимающей стороне вы можете прочитать ее и ждать дополнительных данных, пока вы не получили или не получили в аренду ожидаемую сторону.Конечно, вы должны улучшить структуру и обработку для обработки потери пакетов и ложных отключений.

...