在我上一篇blog里面叙述了我使用socket传送图片的过程,但是有一个bug,就是我每次接收图片的时候在最后一个图片帧都会等待waitForReadyRead()中设定的时长,这样作是不合理的,所以对它进行修改如下。
1,发送端在图片数据前加上图片长度信息;
2,接收端收到图片长度和数据包里描述长度相同后停止接收
这样就避免了最后一帧数据的等待。
接收端:
代码是从我整个工程里面截取出来的,所以做了一些处理,数据包的格式做了简化。
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版权协议,转载请附上原文出处链接和本声明。