JAVA多线程下载,断点续传(HTTP)

HTTP的断点续传其实很简单,就是通过设置Header (RANGE: bytes=XXXXXXXX- )

1, 通常的HTTP请求

<pre>
`
public static void main(String[] args) {

    try {
        URL url = new URL("http://mirrors.cnnic.cn/apache/abdera/1.1.3/apache-abdera-1.1.3-bin.zip");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        //con.setRequestProperty("RANGE", "bytes=100-");
        con.setRequestMethod("HEAD");
        con.connect();
        Map<String, List<String>> header = con.getHeaderFields();
        Iterator<String> keyIt = header.keySet().iterator();
        while(keyIt.hasNext()){
            String key = keyIt.next();
            List<String> values = header.get(key);
            System.out.print(key+":");
            for (String value:values) {
                System.out.print(value);
                
            }
            System.out.println();
        }
        
    } catch (Exception e) {
        e.printStackTrace();
    }
}

`
</pre>
这时候的输出:
<p>
Last-Modified:Sat, 14 Jun 2014 16:32:17 GMT
null:<b>HTTP/1.1 200 OK</b>
Server:nginx
ETag:"539c7911-d21551"
Content-Length:13768017
Accept-Ranges:bytes
Connection:keep-alive
Content-Type:application/zip
Date:Fri, 13 May 2016 09:58:20 GMT
</p>
返回的相应码是200,

2,在请求的HEAD中添加RANGE:bytes=XXXXX-

如果添加con.setRequestProperty("RANGE", "bytes=100-");
下面是输出结果:
<p>
Last-Modified:Sat, 14 Jun 2014 16:32:17 GMT
null:<b>HTTP/1.1 206 Partial Content</b>
Server:nginx
ETag:"539c7911-d21551"
Content-Range:bytes 100-13768016/13768017
Content-Length:13767917
Connection:keep-alive
Content-Type:application/zip
Date:Fri, 13 May 2016 10:00:16 GMT
</P>

这次的响应码是206, 并且在response中返回了Content-Range:bytes 100-13768016/13768017
这个100-13768016是这个可以下载的大小,13768017是文件大小。此时的Content-Length:13767917不是文件大小,而是13768016-100=13767917,此时可以下载的大小。

3, 多线程下载文件

多线程下载的原理就是,多个线程同时发送请求通过在head 添加RANGE:bytes=XXXXX-
比如线程1设置RANGE:bytes=1000-,线程2设置RANGE:bytes=2000- 等等

4,断点续传

断点续传是把每个线程下的位置保存一个文件,下次在请求的时候从没有下载的地方开始

5,简单实现

程序结构:

multithread.png

源码:github
测试代码:
<p>
<pre>

public static void main(String[] args) {
DownLoader dl = DownLoader.getInstance();
dl.setUrl("http://mirrors.cnnic.cn/apache/abdera/1.1.3/apache-abdera-1.1.3-bin.zip");
dl.setOnDownLoadListener(new DownLoaderListener() {

        @Override
        public void onError(String arg0) {
            System.out.println(arg0);
        }

        @Override
        public void onFinish(String arg0) {
            System.out.println(arg0);
        }

        @Override
        public void onUpgrade(float arg0) {
            System.out.println(arg0);

        }
    });

    dl.setThreadCount(3);
    dl.start();
}

</pre>

</p>
程序有很多不足,请多多指教,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、为什么要使用多线程,多线程真的能提高效率吗? 1.1为什么要使用多线程 多线程编程的目的,就是"最大限度地利用...
    程序员学园阅读 906评论 0 6
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,453评论 6 152
  • 工作流程 一次HTTP操作称为一个事务,其工作过程可分为四步: 1)首先客户机与服务器需要建立连接。只要单击某个超...
    保川阅读 4,639评论 2 14
  • 最开始知道《奇葩说》这个节目是因为艾力老师发的微博。14年底过年的时候在家一口气看完了第一季。喜欢这个与众不同的节...
    Limyar阅读 224评论 0 0
  • 语文作业: 把今天学的复韵母iu各写两行,每行后四个带声调,拼读各写两遍,儿歌和拼读读一读。 数学作业: 预备数学...
    瑞睿家阅读 186评论 0 0