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"<
代码是从我整个工程里面截取出来的,所以做了一些处理,数据包的格式做了简化。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小