快速业务通道

HTTP多线程断点续传下载的尝试 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

HTTP多线程断点续传下载的尝试

时间:2010-12-16 java2000

直接看代码吧,废话一点不多说。

功能介绍:

1 多线程HTTP下载

2 支持断点续传

3 临时文件下载,成功后改名

4 提供防盗链的破解

Java代码

1.import java.io.BufferedInputStream;
2.import java.io.BufferedWriter;
3.import java.io.File;
4.import java.io.OutputStreamWriter;
5.import java.io.RandomAccessFile;
6.import java.net.Socket;
7.import java.net.URL;
8.import java.net.URLConnection;
9.import java.util.HashMap;
10.import java.util.Map;
11.
12./**
13. * HTTP的多线程下载工具。
14. *
15. * @author 赵学庆 www.java2000.net
16. */
17.public class HTTPDownloader extends Thread {
18.  // 要下载的页面
19.  private String page;
20.
21.  // 保存的路径
22.  private String savePath;
23.
24.  // 线程数
25.  private int threadNumber = 2;
26.
27.  // 来源地址
28.  private String referer;
29.
30.  private String cookie;
31.
32.  int threadPointer = 0;
33.
34.  private Map<Integer, HTTPDownloaderThread> threadPool = new HashMap<Integer, HTTPDownloaderThread>(); // 线程迟
35.
36.  // 最小的块尺寸。如果文件尺寸除以线程数小于这个,则会减少线程数。 37.  private int MIN_BLOCK = 10 * 1024;
38.
39.  public static void main(String[] args) throws Exception {
40.    HTTPDownloader d = new HTTPDownloader("http://www.xxxxx.com/a.rar", null, "d://a.rar", 10, null);
41.    d.down();
42.  }
43.
44.  public void run() {
45.    try {
46.      down();
47.    } catch (Exception e) {
48.      e.printStackTrace();
49.    }
50.  }
51.
52.  /**
53.   * 下载操作
54.   *
55.   * @throws Exception
56.   */
57.  public void down() throws Exception {
58.    URL url = new URL(page); // 创建URL
59.    URLConnection con = url.openConnection(); // 建立连接
60.    con.setRequestProperty("Referer", referer == null ? page : referer);
61.    con.setRequestProperty("UserAgent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; flashget)");
62.    int contentLen = con.getContentLength(); // 获得资源长度
63.    if ((contentLen / MIN_BLOCK + 1) < threadNumber) {
64.      threadNumber = contentLen / MIN_BLOCK + 1; // 调整下载线程数  65.    }
66.    if (threadNumber > 10) {
67.      threadNumber = 10;
68.    }
69.    int begin = 0;
70.    int step = contentLen / threadNumber + 1;
71.    int end = 0;
72.    HTTPDownloaderThread thread;
73.    for (threadPointer = 0; threadPointer < threadNumber; threadPointer++) {
74.      end += step;
75.      if (end > contentLen) {
76.        end = contentLen;
77.      }
78.      thread = new HTTPDownloaderThread(this, threadPointer, begin, end);
79.      threadPool.put(threadPointer, thread);
80.      thread.start();
81.      begin = end;
82.    }
83.  }
84.
85.  /**
86.   * 一个线程完活了。
87.   *
88.   * @param id 完活的线程id
89.   */
90.  public synchronized void finished(int id) {
91.    threadNumber--;
92.    threadPool.remove(id);
93.    if (threadNumber <= 0) {
94.      System.out.println("FINISHED:" + savePath);
9

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号