• 4800阅读
  • 2回复

UDP发送图片 [复制链接]

上一主题 下一主题
离线dreamtdp
 
只看楼主 倒序阅读 楼主  发表于: 2013-05-02
我采用UDP发送图片,有时能显示图片,有时不能显示(多数情况是这样),发现丢包好多,如何才能接收图片并正常显示?
离线dreamtdp
只看该作者 1楼 发表于: 2013-05-03
回 楼主(dreamtdp) 的帖子
下面是代码 :

用QT 写了个发送和接受图片,发现能正常显示的远小于不能显示的,不知哪里出问题
我每次用UDP发送128B,图片大小为30K,直到发送完成。接受端那里出现丢包现象,偶而会成功一次
请高人帮我看看,下面是代码:
发送端:
    connect(ui->sendButton,SIGNAL(clicked()),
            this,SLOT(sendDatagram()));
    connect(udpSocket,SIGNAL(bytesWritten(qint64)),        
       this,SLOT(UpdateProgress(qint64)));
void client::sendDatagram()
{    
qDebug()<<"sending ......";    
TotalByte=0;  
havewritedByte=0;    
leftByte=0;    
outblock=0;  
loadSize=128;   //每次发送数据的大小    i
magefile=new QFile("./linux.png");  
if(!imagefile->open(QFile::ReadOnly))    
{      
qDebug() << "open file error!";      
return;  
}  
TotalByte=imagefile->size();
    //send datagram  
QDataStream out(&outblock,QIODevice::WriteOnly);//datastream  
out.setVersion(QDataStream:t_4_0);// set datastream setVersion  
outblock= imagefile->read(loadSize);//一次性读取128B数据  
udpSocket->writeDatagram(outblock,  QHostAddress::Broadcast,        
                    ui->ortlineEdit->text().toInt());}
void client::UpdateProgress(qint64 havesendbyte)
{    
qDebug()<<"TotalByte is ......"<<TotalByte;    
havewritedByte+=havesendbyte;  
qDebug()<<"havewritedByte is ......"<<havewritedByte;  
leftByte=TotalByte-havewritedByte;    
qDebug()<<"leftByte is ......"<<leftByte;
ui->sendProgressbar->setMaximum(TotalByte);  
ui->sendProgressbar->setValue(havewritedByte);  
if(leftByte>0)  
{      
  outblock= imagefile->read(qMin(leftByte,loadSize));      
  udpSocket->writeDatagram(outblock,                            
  QHostAddress::Broadcast,                        
  ui->ortlineEdit->text().toInt());  
}  
else//发送完  
{      
    delete imagefile;        
    udpSocket->close();      
    outblock.resize(0);  
  }
}


接受端:    
//有收到数据就更新UI    
connect( udpSocket, SIGNAL( readyRead() ),          
      this, SLOT( processDatagrms_slot() ) );
connect( this, SIGNAL( haveDatagrams_signal( qint64, QByteArray ) ),      
          this, SLOT( updateServerProgress( qint64, QByteArray ) ) );
          
          
void server::processDatagrms_slot()
{  
while ( udpSocket->hasPendingDatagrams() )  
{        

    this->inblock.resize( this->udpSocket->pendingDatagramSize() );      
    //get 数据包大小      
      this->udpSocket->readDatagram( inblock.data(), inblock.size() );        
    
     emit haveDatagrams_signal( this->inblock.size(), inblock);
  }
//接受over ,就显示图片    
QPixmap pixmap;//pixel map  
pixmap.loadFromData( countblock ); //load  all image  byteArray data    
  if ( !pixmap.isNull() ) //is  image  
  {      
      qDebug()<<"ui->imagelabel_3->setPixmap( pixmap ) .....";    
      ui->imagelabel_3->setPixmap( pixmap ); //将图片加载到label      
    ui->imagelabel_3->show();  
}      
  else    
   {    
          ui->imagelabel_3->setText("123...");      
      qDebug()<<"NO LOAD Image ..image is null...";    
   }
inblock.resize(0);  
countblock.resize(0);  
  bytesReceived=0;  
}
//更新进度条
void server::updateServerProgress( qint64 byteshaveReceived, QByteArray havereceiveDatagrams )
{    
    qDebug() << "updateServerProgress  run ......";  
      countblock += havereceiveDatagrams;//累加数据包,用来显示图片  
    bytesReceived += byteshaveReceived;    
    qDebug() << "bytesReceived  is ......" << bytesReceived;
    ...........
}
离线crs811

只看该作者 2楼 发表于: 2014-01-15
你用的方法是基于TCP的,而不是UDP的
乐活 ...   ...
快速回复
限100 字节
 
上一个 下一个