qt 串口粘包_Qt Socket 传输图片——图像拆包、组包、粘包处理

本文介绍了如何使用Qt处理串口粘包问题,以及通过Socket传输大图片时的拆包、组包策略。在Qt 5.5.1环境下,客户端按照特定协议发送图片数据,服务器端采用线程处理接收图片,实现图片的正确组装。通过协议头定义数据包格式,并在服务器端利用线程和条件判断进行粘包处理。
摘要由CSDN通过智能技术生成

之前给大家分享了一个使用python发图片数据、Qt server接收图片的Demo。之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次和大家分享一个对大的图片拆包、组包、处理粘包的例子。

程序平台:ubuntu 、Qt 5.5.1

为了对接收到的图像字节进行组包,我们需要对每包数据规定协议,协议如下图:

每包数据前10个字节对应含义如下:前两个字节对应数据包类型,中间四字节预留,最后四字节是包内数据实际长度。对应协议图片更方便刚开始上手的兄弟理解。

对协议有了一个了解后,接下来说下程序结构。客户端按照协议发送图片字节,服务器接收字节,如果客户端发多少服务器就收多少那可真是太好了,然而意外总是如期而至。服务器这边由于socket的缓冲总是会粘包,所以服务器这边主要工作是拆包和组包,这也是整个程序组中最重要的部分。其次就是服务器在接收图片时为了响应更及时,单独使用一个线程进行接收图片,这里面我使用的是Qt的moveToThread。也使用过linux的socket以及线程接收图片,感觉性能要比Qt封装过的要好,大家有需要的话可以在公众号后台留言。

接下来跟着程序走:

客户端发送部分:

①读取图片字节

1 voidWidget::on_pbn_readPicture_clicked()2 {3 m_picturePath = m_picturePath +"/auboi5.jpg";4 QPixmap pix;5 bool ret =pix.load(m_picturePath);6

7 QBuffer buffer;8 buffer.open(QIODevice::ReadWrite);9 bool ret2 = pix.save(&buffer,"jpg");10

11 m_pictureByteArray =buffer.data();12

13 if(ret2)14 {15 QString str = "read image finish!";16 ui->textEdit->append(str);17 }18 }

读取图片字节主要用到了Qt的QPixmap 类,这个不细说,大家具体可参考Qt文档。图片字节被读取到m_pictureByteArray中,成功后在textEdit显示read image finish!。

②发送图像拆包

1 QByteArray dataPackage;2

3 //command 0 ,package tot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值