作用:
利用不完整文件的校验块所构成的哈希表顺序查询完整文件的校验块,从而得出匹配情况,并返回不匹配数据块及其相应编号,当然还有一些控制信息。由于该过程比较复杂,所以最好设计一个数据报,便于客户端分析和重组文件。
数据报格式:
|IndexFlag(1字节)
|Index(4字节)
|Length(1字节)
|Buffer(可变,<=127)
|区别数据报种类
|记录校验块编号
|Buffer中所含的数据大小
|未匹配数据
基本思想:
按顺序读取完整文件中的数据块并得到校验块,按照建立的哈希表进行查询,若匹配(滚动和md4均匹配),则读取下一个数据块,若不匹配,则读取下一个字节(类似滑动窗口),并将先前头一个字节加入数据报中,再进行匹配分析。
注意点:
1. 数据报发送时机:数据报buffer字段满时,从不匹配到匹配时。
2. 发送数据报之前写入Length字段。
3. 结尾处理后,最好发送匹配的编号,对客户端重组有利。
4. 一些IO异常处理。
5. 发送时并不直接发送到socket的输出流中,而是先写入本地文件,因为某些缓冲和接受顺序原因。
6. 此部分较为复杂,可能有许多不合理的地方,需要不断完善。
源码:
public void startMatch(String filetotal, InputStream inStreamCheckSum,
OutputStream outStreamFIleBack, OutputStream outStreamMatchIndexs)
throws IOException {
BufferedInputStream inStreamFileTotal = new BufferedInputStream(
new FileInputStream(filetotal));
// BufferedOutputStream outStreamFIleBack = new BufferedOutputStream(
// outStreamBack);
// DataOutputStream outStreamMatchIndexs =