Qt 在粘包的情况下实现上传图片与消息发送

Qt 在粘包的情况下实现上传图片与消息发送


近期在写一个通讯软件,作为 Qt 的项目练手。因为考虑用户头像更换问题,所以就需要用户把用户头像上传到服务器,这样该用户的好友就能通过 HTTP 请求(可看博客:Qt 访问服务器上的图片),在自己的客户端看到更新后的头像。

理论上,先由客户端发送一个更换头像的请求,然后再将选好的图片上传到服务器,上传结束后客户端再发送一个图片传输结束请求,这样一整个更换头像的流程就结束了。但是,实际上,我们需要考虑的东西和遇到的问题会比理论上的多且复杂,例如,由于图片的大小不确定,就可能上传的图片大小为 几十mb ,TcpSocket 一次发送不了这么多的数据,所以需要多次发送,但是,服务端的一次接收只能读 1966(qtcreator 5.9) 大小的字节,所以服务端也需要多次接收,才能将一个图片文件完整的保持下来。最为关键的是,客户端发送出来的数据存在粘包,以至于,读出来的数据不能判断是上传的图片数据,还是混合着图片数据和消息数据的数据。

前置知识:缓冲区概念QTcpSocket::read(qint64 MaxSize)QTcpSocket::bytesWrittenQTcpSocket::write()

之前就有遇到过粘包问题,但是网络和群友给出的解决方案数模拟数据包的形式发送(可看博客:Qt 发送端一次发送多条数据,但接收端只接收一次总的数据),总感觉没有解决根本问题,因为模仿数据包的形式发送依旧是存在粘包问题,那我又怎么知道数据包的头部在什么位置,数据包头部的大小,我当前所读的数据是否又包含了好几个数据包。(此处可用 QDataStream 将数据大小写入 QByteArray 可以解决数据包头部大小问题,具体实现应该会在下一篇文章中写)

处理思路:

  1. 构建图片上传请求,在请求中需要注明图片的大小和发送者,发送传输请求,让服务端准备好接收图片。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值