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

本文介绍HTTP协议下如何实现断点续传和多线程下载功能,包括通过设置RANGE头字段来请求文件的部分内容,以及如何利用多线程并发提高下载速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1, 通常的HTTP请求

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();
        }
    }

这时候的输出:


Last-Modified:Sat, 14 Jun 2014 16:32:17 GMT
null:HTTP/1.1 200 OK
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


返回的相应码是200,
#2,在请求的HEAD中添加RANGE:bytes=XXXXX-
如果添加con.setRequestProperty("RANGE", "bytes=100-");
下面是输出结果:


Last-Modified:Sat, 14 Jun 2014 16:32:17 GMT
null:HTTP/1.1 206 Partial Content
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
测试代码:


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();
}

程序有很多不足,请多多指教,谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值