TCP理论上是一个稳定的连接。它不会丢失数据包,也不会在数据包中间插入随机数据包。它绝对可以保证数据包的完整性。 TCP 连接有两种类型。一是长连接。一旦连接后就可以连续通信。主要应用于实时上传等频繁通信场景。还有一个短连接。客户端发送数据或服务器收到数据后立即断开连接。主要用于不频繁通讯的场景。例如报警上传。毕竟警报很少是一天发生的。最好使用短连接,这样可以节省大量的系统开销。 Qt也很好地封装了TCP通信。在一些小并发,只有几十个连接的项目中,效率还是可以接受的。据说Qt5的QNetwork组件底层已经重写,效率比Qt4还要高。我没有详细查过相应的源码,只是听说。我们通常使用三个Qt网络通信类:QTcpSocket客户端类、QTcpServer服务器类和QUdpSocket通信类。为什么没有QUdpServer 类?事实上,UDP是无连接通信,占用资源很少。它可以是客户端,也可以是服务器。如果它想成为服务器,只需指定端口并调用bind方法即可。该程序支持TCP模式和UDP模式。经过实际测试,建议使用TCP模式。 UDP模式在短时间内发送大量数据包时,由于无连接,会造成丢包,而且数据包大小有限制,为65507个字。结,大约64K,所以UDP方式实时传输的图片分辨率不能太大。实测640*480的视频文件相当不错。 720P基本就有点惨了,丢包很多。该协议稍后可能需要改进。
本程序及协议中约定的图片均采用base64编码进行传输。接收后,对base64字符串进行解码,生成图片。 QByteArray内置类toBase64方法将base64编码的字符串转换为base64编码的字符串。 QByteArray:fromBase64方法将base64字符串恢复为数据。经过多次实验,统计数据显示,编解码速度尚可,720P图片编码25ms-30ms,解码15ms-20ms,1080P图片编码35ms-40ms,解码25ms-30ms。一般来说,一秒传输25-30张图片、解码25-30张图片是没有问题的。它只是使用CPU编码和解码。如果打开的通道数较多,仍然会消耗大量CPU,但可以处理。一些简单的应用场景依然如鱼得水,没有任何压力。
体验地址:[https://gitee.com/feiyangqingyun/QWidgetExe](https://gitee.com/feiyangqingyun/QWidgetExe) 文件名:bin_video_image.zip。
二、功能特点
1.多线程发送接收图像数据并解析图像数据,不阻塞主界面。
2、同时支持TCP和UDP模式,封装了TCP模式和UDP模式的客户端类和服务器类。
3、图传客户端支持同时发送到多台服务器,可以作为教师机同屏发送到多台学生机的应用场景。
4.支持多个客户端同时发送图片到服务器。服务器端的每个连接都会自动开启一个线程来发送、接收和解析图片数据。
5、定制标签控制信号槽机制,画图不遮挡主界面。
6.自带心跳机制判断离线状态,自动重连服务器,并可设置超时时间。
7、每条消息都有一个唯一的消息标识符uuid。服务器收到后会返回对应的uuid消息以表示收到。客户端根据这个返回信息可以判断服务器已经解析成功。不需要再次发送,保证了发送出去。数据服务器接收并解析成功。
8、每条消息都有一个唯一的图像识别标志,相当于一个ID号。根据这个标识,确定需要解析并显示哪个界面。
9. 图片以base64字符串格式发送。接收端接收base64字符串图片数据并解码重新生成图片。
10、所有数据的发送和接收均带有信号发送出去,方便输出查看。
11、都提供单例类,只有一个时可以直接使用,无需new。
12、使用定制的xml协议,可以自由扩展其他属性字段,如添加图片内容等。
三、通信协议
1、TCP长连接和UDP协议可选,默认通讯端口6000。
2. 使用定制的xml通信协议。
3、所有传输都添加20字节的头部:IIMAGE:0000000000000,IIMAGE:是固定头部,后面跟着一个13字节内容长度(包括20个头部长度)的字符串。
4. 后面的协议部分省略了头字节。
5、服务器返回的数据中的uuid就是接收到的消息对应的uuid。
6、服务器每次返回时都带上当前时间,可以用于客户端时间校正。
客户端发送心跳?xml version=\’1.0\’encoding=\’UTF-8\’?ImageClient Uuid=\’8AF12208-0356-434C-8A49-69A2170D9B5A\’ Flag=\’SHJC00000001\’ClientHeart //ImageClient服务器收到心跳并返回? xml version=\’1.0\’encoding=\’UTF-8\’?ImageServer Uuid=\’8AF12208-0356-434C-8A49-69A2170D9B5A\’NowTime=\’2019-12-05 16:37:47\’Ok/ImageServer客户端发送图片?xml version=\’1.0 \’编码=\’UTF-8\’?ImageClient Uuid=\’66BCB44A-B567-48ED-8889-36B8FA6C4363\’Flag=\’SHJC00000001\’ClientImage图像base64编码字符串/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDB QNDAsLDBkSEw 8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI yMjIyMjIyMjI yMjL/waARCAJAAtADASIAAhEBAxEB/8QAHwAAAQUBAQEB. nvWsQRlXA61mTjmtWcdazLgcmrQ0U2plSMKjpDE7UtFFAwxRRRQAUuKWigQlFFFLcD //2Q==/ClientImage/ImageClient服务器接收图像并返回?xml version=\’1.0\’encoding=\’UTF-8\’?ImageServer Uuid=\’66BCB44A-B567-48ED-8 889-36B8FA 6C4363\’现在时间=\’2019 – 12-05 16:38:47\’Ack/图像服务器
用户评论
沐晴つ
想学怎么用 Qt 来处理图片和视频的网络传输,这太酷了!
有12位网友表示赞同!
强辩
我一直用 UDP 传输低延时数据,感觉 TCP 会比较慢,你们有什么建议?
有5位网友表示赞同!
陌潇潇
Qt 真的是强大的框架,可以用来做很多事情,这篇文章让我更想探索它的应用范围。
有16位网友表示赞同!
金橙橙。-
视频传输需要考虑带宽和码率啊!
有15位网友表示赞同!
青楼买醉
我之前也尝试用 Qt 做过网络编程,但是遇到了一些问题,你们的分享或许有所帮助。
有9位网友表示赞同!
哭花了素颜
Qt 的跨平台性让我很有吸引力,这样就可以在不同系统上测试你的项目了。
有16位网友表示赞同!
ˉ夨落旳尐孩。
TCP 和 UDP 这两个协议各有优缺点,需要根据应用场景来选择合适的方案。
有16位网友表示赞同!
迷路的男人
好文章!希望能够有更详细的代码示例,这样更容易理解。
有15位网友表示赞同!
秘密
Qt 可以高效地处理图像数据吗?
有11位网友表示赞同!
独角戏°
想了解更多关于带宽和码率调优的信息…
有12位网友表示赞同!
杰克
这个帖子内容不错,让我对 Qt 开发网络传输应用有了新的认识。
有19位网友表示赞同!
雨后彩虹
学习 Qt 不容易啊!需要花时间去理解它的结构和API。
有14位网友表示赞同!
|赤;焰﹏゛
网络传输效率总是很绕脑的…
有12位网友表示赞同!
仰望幸福
视频流传输太酷了!希望能看到更专业的案例分享。
有12位网友表示赞同!
走过海棠暮
Qt 的图形编程能力令人赞叹,可以用来处理复杂的图像数据。
有12位网友表示赞同!
浮殇年华
我想学习如何使用 Qt 构建一个简单的图片传输应用。
有12位网友表示赞同!
仅有的余温
图片和视频的网络传输涉及很多方面,比如安全、可靠性等等。
有13位网友表示赞同!