【问题标题】:Sending pictures via qt TCP/IP通过qt TCP/IP发送图片
【发布时间】:2018-10-24 00:17:58
【问题描述】:

我正在尝试通过 QTCPsocket 发送图片,使用 localhost (127.0.0.1) 可以正常工作。 如果我通过以太网将它发送到另一台电脑,有时 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

【问题讨论】:

标签: c++ qt tcp-ip qtcpsocket tcpsocket


【解决方案1】:

没有什么能确保您在一次阅读中收到您的照片。确实如此。一种解决方案是将您的图片封装在您将定义的框架中,其中包含有关该图片的信息。 一种简单(而且不是真正防弹)的方法是将图片的大小添加为帧的前 4 个字节。 在接收端,您可以读取它,并等待其他数据,只要您没有收到或至少接收到预期的端。 当然,您应该改进结构和处理以处理数据包丢失和虚假断开连接。

【讨论】:

  • tnx 为您的回复,您能检查我的答案吗?
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2016-05-12
  • 2016-07-31
相关资源
最近更新 更多