闲言少续,今天看了刊IcePatch客户端代码。
现看看Patch的机制,服务器端有一个目录存放要更新的文件,并且生成一个IcePatch.sum文件存放该目录中的文件信息,包括文件大小,文件名,目录名,以及文件的checksum值。客户端就是根据这个sum文件来比较本地的相应IcePatch.sum文件来更新。
分析客户端代码:客户端首先自定义个类继承自PatcherFeedback类,主要用来patch过程中的回调,显示进度以及和用户互操作。自定义类主要重写了PatcherFeedback类的虚函数。(题外话,在自定义类TextPatcherFeedBack中函数fileListProgress中用到了cout <
cout << "hella";cout<
这里也提供了double型转化为string型的方法:
ostringstream s;
s << percent << '%';//percent是double类型
_lastProgress = s.str();//_lastProgress是string类型
cout << _lastProgress << flush;
即,先把该数字读入ostringstream中,再转换成string,其中也可以把string类型或者int类型加入ostringstream中再转化成string.该作用类似于CString 的Format操作。还有就是在console情况下对键盘按键的处理。在函数keyPressed中有介绍,主要是用到方法_kbhit。
按照客户端程序走,首先是,prepare(),这里主要执行的是读取客户端下载文件夹内IcePatch.sum文件中的内容,然后读入到定义的一个结构序列FileInfoSeq中,该结构包括大小,checksum,文件名......
checksum值40个字节,计算的方法是读入文件内容然后进行SHA1的计算。
(题外话:删除vector中重复的元素,方法为
vector vi;
.....vi赋值
vi.erase(unique(vi.begin(),vi.end()),vi.end);
)
然后是patch,patch主要的部分是分成了2个线程逐一获取源文件信息,而且保证2个线程顺序把获得的信息写入本地的文件中,这种方法的好处是方便断点续传的实现,同时,2个线程进行数据读取也提高了速率。ICE自带了互斥信号量(Mutex)以及监视器(Monitor)更方便了多线程的操作。