Qt使用Socket传送图片(完善)

在我上一篇blog里面叙述了我使用socket传送图片的过程,但是有一个bug,就是我每次接收图片的时候在最后一个图片帧都会等待waitForReadyRead()中设定的时长,这样作是不合理的,所以对它进行修改如下。
1,发送端在图片数据前加上图片长度信息;
2,接收端收到图片长度和数据包里描述长度相同后停止接收
这样就避免了最后一帧数据的等待。
代码如下:
发送端:

void Widget::on_pushButton_clicked() { qDebug()<<"sendPicture clicked"; QPixmap pix(tr("th.jpg")); QBuffer buffer; buffer.open(QIODevice::ReadWrite); pix.save(&buffer,"jpg"); quint32 pix_len = (quint32)buffer.data().size(); qDebug("image size:%d",pix_len); char buf[10]; memcpy(buf,&pix_len,4); QByteArray dataArray(buf,pix_len); dataArray.append(buffer.data()); client->connectToHost(QHostAddress("192.168.1.102"),8001); if(!client->waitForConnected(3000)){ qDebug()<<"connect fail"; return; } qDebug()<<"connect success"; quint32 write_len = client->write(dataArray); qDebug("write len:%d",write_len); }


接收端: 【Qt使用Socket传送图片(完善)】
void Widget::acceptConnection() { qDebug()<<"accept a connection!"<nextPendingConnection(); //connect(clientConnection,SIGNAL(readyRead()),this,SLOT(readClient())); QByteArray array; quint32 data_len = 0; quint32 len = 0xffffffff; struct Head head; while(clientConnection->waitForReadyRead(5000)){ qDebug()<<"bytesAvailable"<> len qDebug("datalen:%d",len); } data_len += clientConnection->bytesAvailable(); array.append((QByteArray)clientConnection->readAll()); if(data_len == len){ qDebug()<<"ok,all bytes recvd"<pic->setPixmap(picture); picture.save("teacher.jpg","jpg",-1); //QBuffer buffer(&array); //method 2 //buffer.open(QIODevice::ReadOnly); //QImageReader reader(&buffer,"JPG"); //QImage img = reader.read(); //if(!img.isNull()){ //qDebug()<<"right"<pic->setPixmap(QPixmap::fromImage(img)); //} else { //qDebug()<<"error"<


代码是从我整个工程里面截取出来的,所以做了一些处理,数据包的格式做了简化。

    推荐阅读