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);
}

接收端:

void Widget::acceptConnection()
{
    qDebug()<<"accept a connection!"<<endl;
    clientConnection = server->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"<<endl;

        if(data_len == 0){
            QDataStream in(clientConnection);

            in >> len
            qDebug("datalen:%d",len);
        }
        data_len += clientConnection->bytesAvailable();
        array.append((QByteArray)clientConnection->readAll());
        if(data_len == len){
            qDebug()<<"ok,all bytes recvd"<<endl;
            break;
        }
    }
    qDebug("recvd len:%d",data_len);

    QPixmap picture;//method 1
    picture.loadFromData(array,"jpeg");
    ui->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"<<endl;
//        ui->pic->setPixmap(QPixmap::fromImage(img));
//    } else {
//        qDebug()<<"error"<<endl;
//    }
}

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


版权声明:本文为u014331618原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。