需求分析
《多文件云传输》项目中有这样一个应用背景:
文件的发送是按照已定的规则被拆分成好几个片段,每一个片段包括文件的编号和这个片段首字节在整个文件中的偏移和这个片段的长度。提供这三个信息,是为了接受时能根据这些信息,把片段再写回成一整个文件。
但是文件的发送并不是每次都能够成功,可能某一个发送方在发送时,突然掉线,那么接受时,某个文件可能就会缺少一个片段。我们把接下来发送未发送的片段这个操作称为断点续传。那么如果我们要进行断点续传,首先,我们要统计出是哪个片段的确实。
接下来这个算法就是用来统计未发送的片段。
举例
假设一个文件长度为20:下面的数字分别表示未接受的各个字节
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 写成0:20,0是偏移,20是长度
第一次接收到片段5:4,把原有片段分成俩个片段: 未接受片段 0:5,9:11
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
第二次接收到片段12:4。 未接受片段0:5,9:3,16:4
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
第三次接收到片段9:3 未接受片段0:5,16:4
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
接收完毕,则未接受的片段就是0:5,16:4。
那么我们是如何来计算出未接受的片段的?
-
假设我们把0:20表示成 curOff :curLen,第一次接收到的表示成recOff:recLen
即curOff:curLen = 0:20;recOff:recLen = 5:4
左片段被表示为:curOff:recOff-curOff -> 0:5
右片段为:recOff + recLen:curOff+curLen-recOff -> 9:11
计算出这俩个片段之后,顺序的放在一个链表中存储。 -
当进行到第二次接收时,发现原有的片段已经有俩个了,那么我们刚才的算法还怎么用呢?
首先我们要在原记录的片段中找到合适的片段当做当前片段。第二次接收的片段12:4,这个片段在9:11片段范围内,所以我们就把9:11当做当前片段,继续第一部的算法。
curOff:curLen = 9:11
recOff:recOff = 12:4
原来的9:11变成俩个片段:9:3,16:4,把这俩个片段一次放入到链表。
现在的链表存放:0:5,9:3,16:4 -
当第三次时,又出现了了特殊的情况,得到片段9:3,计算得出应该在原来9:3这个范围。
根据原有的算法得出&#