簡體   English   中英

通過qt TCP / IP發送圖片

[英]Sending pictures via qt TCP/IP

我正在嘗試通過QTCPsocket發送圖片,使用localhost(127.0.0.1)可以正常工作。 如果我通過以太網將其發送到另一台PC,有時Qt會兩次接收到它,請參見調試輸出。

我該如何解決?

服務器端:

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個字節。 在接收方,您可以讀取它,並等待其他數據,只要您沒有這樣做,也不會從租賃方獲得預期的結果。 當然,您應該改進結構和處理以處理數據包丟失和虛假斷開連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM