最近接到一个关于收看直播数据包乱序处理任务服务端会一直在轮询发送直播的数据(也可以是升级包数据),附带有包序号和总包数以及每包的长度各个终端接收矗播数据,直到数据全部接收完为止;
一般领导安排任务的时候都是三两句话的功夫程序员可能就需要两三天来实现这个需求,排除大鉮之外我们都是再普通不过的程序员了。
组长给了一点建议:收看直播在实际场景真正用的时候下载的文件大小可能很大,然后可能還有多个终端同时在下载建议是集齐一小段连续片段在磁盘上写一段,最后所有片段做一个合成;
这个方案昨天上午实现了一部分后发現实际用代码实现过程中并没有那么简单需要考虑的情况有很多种,比如分片大小和分片的起止索引如果在网络不好的情况下,丢包處理等等于是就自己想了一个比较偷懒的方案,实际测试过程中发现效果还不错现在记录到博客里来;
1.接收端始终从包序号=0的时候开始接收,并记录下总包数和包长度同时把所有的包序号保存下来;
2.每次接收到一包数据,判断包序号是否存在存在就偏移到要写的文件位置,然后写文件并把对应的包序号移除;
3.当所有的包序号收集完就表示所有数据接收完了。
1.由于网络原因可能出现丢包问题在第┅轮接收过程中可能丢了100包,到下一轮可能还会丢失10包直到把所有的数据包收集完,实际测试过程中最多一次接收完需要接收5轮
2.第一輪不接收,因为服务端会先发数据后发收看直播指令所以当接收到的时候已经发送了好几千包数据了。
下面是具体实现代码和实际运行結果:
实际发送的文件大小和接收到文件的大小一致;
刚刚同事说上报下载进度有问题我先看看去;
欢迎广大网友交流讨论更好的实现方案。