日期:2014-05-20  浏览次数:20591 次

想做个多线程下载的项目
我刚学完J2SE,想做个类似迅雷的下载软件,能做吗?谁能告诉我点思路,比如怎么读取要下载的文件??不要源码,只想知道思路~~~知道的说下,谢谢!
有满意答案立马结帖

------解决方案--------------------
这里有程序和思路
http://www.blogjava.net/Rexcj/archive/2008/07/27/217793.html
我贴点思路上来 不过最好看下那里的代码片段 反正只是片段

实现的这个http下载工具功能很简单,就是一个多线程以及一个断点恢复,当然下载是必不可少的。那么大概先整理一下要做的事情:

1、 连接资源服务器,获取资源信息,创建文件

2、 切分资源,多线程下载

3、 断点恢复功能

4、 下载速率统计

大概就这几点吧,那么首先要做的就是连接资源并获取资源信息,我这里使用了JavaSE自带的URLConnection进行资源连接

第二步,切分资源,实现多线程。在上一步我们已经获得了资源的长度contentLen,那么如何根据这个对资源进行切分呢?假如我们要运行十个线程,那么我们就先把contentLen处以10,获得每块的大小,然后在分别创建十个线程,每个线程负责其中一块的写入,这就需要利用到RandomAccessFile这个类了,这个类提供了对文件的随机访问,可以指定向文件中的某一个位置进行写入操作

在这里使用到了DLThread这个类,我们先来看看这个类的构造方法的定义:

public DLThread(DLTask dlTask, int id, long startPos, long endPos)

第一个参数为一个DLTask,这个类就代表一个下载任务,里面主要保存这一个下载任务的信息,包括下载资源名,本地文件名等等的信息。第二个参数就是一个标示线程的id,如果有10个线程,那么这个id就是从1到10,第三个参数startPos代表该线程从文件的哪个地方开始写入,最后一个参数endPos代表写到哪里就结束。

我们再来看看,一个线程启动后,具体如何去下载,请看run方法:

根据startPos和endPos对文件机型写操作,每个线程都有自己独立的一个资源块,从startPos到endPos。上面的方式就是线程下载的核心,多线程搞定后,接下来就是实现断点恢复的功能,其实断点恢复无非就是记录下每个线程完成到哪个未知,在这里我就是使用curPos进行的记录,大家在上面的代码就应该可以看到,我会记录下每个线程的curPos,然后在线程重新启动的时候,就把curPos当成是startPos,而endPost则不变即可,大家有没注意到run方法里有一段这样的代码:

断点恢复的做法了,和新创建一个线程没什么不同,只是startPos不一样罢了,其他都一样,不过仅仅有这个还不够,因为如果程序关闭的话,这些信息又是如何保存呢?例如文件名啊,每个线程的curPos啊等等,大家在使用下载软件的时候,相信都会发现在软件没下载完的时候,在目录下会有两个临时文件,而其中一个就是用来保存下载任务的信息的,如果没有这些信息,程序是不知道该如何恢复下载进度的。而我这里又如何实现的呢?我这个人比较懒,又不想再创建一个文件来保存信息,然后自己又要读取信息创建对象,那太麻烦了,所以我想到了java提供序列化机制,我的想法就是直接把整个DLTask的对象序列化到硬盘上,上面说过DLTask这个类就是用来保存每个任务的信息的,所以我只要在需要恢复的时候,反序列化这个对象,就可以很容易的实现了断点功能

....
------解决方案--------------------
前不久我也做过类似的东西
发现迅雷下载很快的原因 就是用候选资源多点同时下载
根据下载信息从迅雷服务器搜索 下载过此文件的所有其他用户地址 
所以很少有资源不足 或者 源地址已经没有相关文件而无法完成下载的现象 
 我觉得自己写这程序只能做到单点连接 下载效果肯定达不到迅雷那样的专业软件
但推荐楼主做做看 因为这里会用到se的很多重要的类 收获应该不少

2楼写的很不错了
------解决方案--------------------
你的 工作准备定在J2SE这嘛?

可以说现在 java最火的地方还是J2EE

如果你主攻J2SE 准备在这方面发展 可以多琢磨琢磨

各种程序多敲 不错的

但想继续学习J2EE 还是建议楼主 就不要搞那么细了 那么深了

差不多就先往下走吧 先工作要紧 边工作边学 呵呵
------解决方案--------------------
我博客里有一个多点下载的代码,其实http协议里面本身就支持多点下载。

HTTP多线程,端口侦听和服务的完整程序