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

本文介绍如何使用Qt处理大图片通过Socket发送时的粘包问题。客户端按照预设协议发送图片,服务器端接收并进行拆包、组包处理。详细解释了协议设计、数据发送和接收的步骤,包括图像数据的读取、发送、接收及粘包的处理策略。程序在Ubuntu和Qt 5.5.1环境下运行,并提供了关键代码示例。
摘要由CSDN通过智能技术生成

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

程序平台:ubuntu 、 Qt 5.5.1

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

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

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

接下来跟着程序走:

客户端发送部分:

①读取图片字节

void Widget::on_pbn_readPicture_clicked()

{

m_picturePath = m_picturePath +"/auboi5.jpg";

QPixmap pix;

bool ret = pix.load(m_picturePath);

QBuffer buffer;

buffer.open(QIODevice::ReadWrite);

bool ret2 = pix.save(&buffer,"jpg");

m_pictureByteArray = buffer.data();

if(ret2)

{

QString str = "read image finish!";

ui->textEdit->append(str);

}

}

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

②发送图像拆包

QByteArray dataPackage;

// command 0 ,package total size

QDataStream dataHead(&dataPackage,QIODevice::ReadWrite);

dataHead << quint16();

dataHead << quint32();

dataHead << quint32(m_pictureByteArray.size());

dataPackage.resize();

mp_clsTcpSocket->write(dataPackage);

dataPackage.clear();

QThread::msleep();

这里我拿医一包数据举例说明。第一包数据是将读取到的整张图片的大小发送出去,以判断接收方接收到的数据是否完整。主要涉及到Qt一些数据类型的转换,如将整型字节存入QByteArray 中使用QDataStream 。之后将数据包大小重新设置为40960,方便服务器处理粘包。

③发送utf8 编码的中文

void Widget::on_pbn_sendChinese_clicked()

{

QByteArray dataPackage;

QByteArray chinese = "阶级终极形态假设!";

/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值