多线程下载的原理是很明白的,不用多说.
但具体细节还是值得研究一下.早些天用Java自制了一个多线程下载,然后用fiddler捉包看了一下IDM的多线程下载方法,发现很不一样.
我自己的做法是把文件分成很多小份,不管有多少个线程.每个线程不断接份额任务,完成了就再接下一份,直到完结.
IDM的做法是多少个线程就平分成多少份,当一个线程完成,就去分担另一个线程的任务.
我设计的时候,觉得分成许多小份的方法记录简单,然而仔细分析,IDM的做法记录也不困难.另外我对网络传输有点理解不透彻.
我们设定Range时,不需要老实的需要多少就设定为多少,直接设定需要的开头就行了,结尾可以到文件最后!因为数据是一点一点传输的,
我们读取了自己需要的分段就可以切断连接,用Java就是关闭流了.
因为不知道服务器会做什么奇怪的事情,Range设定似乎是需要的开头到文件结尾比较好,看起来像单线程的续传.
IDM的做法,记录上的关键在于:若当前所有任务都顺利完成,那么文件下载是完整的!记住这一件事就够了!我们只需要记录当前的所有任务!
有多少线程就有多少任务.
如果要增加线程,或者是一个线程完结了去帮其他线程,那么就改变被帮助线程的任务记录.
减少线程也简单,让记录中的一些任务处于等待就行,有空余线程时,自然会接下等待中的任务.