- 浏览: 53898 次
- 性别:
- 来自: 杭州
最新评论
http://fenglingcorp.iteye.com/blog/1956886
package download; import java.io.*; class NewProgress implements DownloadEvent { private long oldPercent = -1; public void percent(long n) { if (n > oldPercent) { System.out.print("[" + String.valueOf(n) + "%]"); oldPercent = n; } } public void state(String s) { System.out.println(s); } public void viewHttpHeaders(String s) { System.out.println(s); } } public class Main { public static void main(String[] args) throws Exception { HttpDownload httpDownload = new HttpDownload(); DownloadEvent progress = new NewProgress(); if (args.length < 1) { System.out.println("用法:java class 下载文件名"); return; } FileInputStream fis = new FileInputStream(args[0]); BufferedReader fileReader = new BufferedReader(new InputStreamReader( fis)); String s = ""; String[] ss; while ((s = fileReader.readLine()) != null) { ss = s.split("[ ]+"); if (ss.length > 2) { System.out.println("\r\n---------------------------"); System.out.println("正在下载:" + ss[0]); System.out.println("文件保存位置:" + ss[1]); System.out.println("下载缓冲区大小:" + ss[2]); System.out.println("---------------------------"); httpDownload.download(new NewProgress(), ss[0], ss[1], Integer .parseInt(ss[2])); } } fileReader.close(); } }
package download; import java.net.*; import java.io.*; import java.util.*; public class HttpDownload { private HashMap httpHeaders = new HashMap(); private String responseCode; private void generateHttpRequest(OutputStream out, String host, String path, long startPos) throws IOException { OutputStreamWriter writer = new OutputStreamWriter(out); writer.write("GET " + path + " HTTP/1.1\r\n"); writer.write("Host: " + host + "\r\n"); writer.write("Accept: */*\r\n"); writer.write("User-Agent: My First Http Download\r\n"); if (startPos > 0) writer.write("Range: bytes=" + String.valueOf(startPos) + "-\r\n"); writer.write("Connection: close\r\n\r\n"); writer.flush(); } private void analyzeHttpHeader(InputStream inputStream, DownloadEvent de) throws Exception { String s = ""; byte b = -1; while (true) { b = (byte) inputStream.read(); if (b == '\r') { b = (byte) inputStream.read(); if (b == '\n') { if (s.equals("")) break; de.viewHttpHeaders(s); addHeaderToMap(s); s = ""; } } else s += (char) b; } } private void analyzeFirstLine(String s) { String[] ss = s.split("[ ]+"); if (ss.length > 1) responseCode = ss[1]; } private void addHeaderToMap(String s) { int index = s.indexOf(":"); if (index > 0) httpHeaders.put(s.substring(0, index), s.substring(index + 1) .trim()); else analyzeFirstLine(s); } private String getHeader(String header) { return (String) httpHeaders.get(header); } private int getIntHeader(String header) { return Integer.parseInt(getHeader(header)); } public long getFileLength() { long length = -1; try { length = getIntHeader("Content-Length"); String[] ss = getHeader("Content-Range").split("[/]"); if (ss.length > 1) length = Integer.parseInt(ss[1]); else length = -1; } catch (Exception e) { } return length; } public void download(DownloadEvent de, String url, String localFN, int cacheSize) throws Exception { File file = new File(localFN); long finishedSize = 0; long contentLength = 0; FileOutputStream fileOut = new FileOutputStream(localFN, true); URL myUrl = new URL(url); Socket socket = new Socket(); byte[] buffer = new byte[cacheSize]; // 下载数据的缓冲 if (file.exists()) finishedSize = file.length(); // 得到要下载的Web资源的端口号,未提供,默认是80 int port = (myUrl.getPort() == -1) ? 80 : myUrl.getPort(); de.state("正在连接" + myUrl.getHost() + ":" + String.valueOf(port)); socket.connect(new InetSocketAddress(myUrl.getHost(), port), 20000); de.state("连接成功!"); // 产生HTTP请求消息 generateHttpRequest(socket.getOutputStream(), myUrl.getHost(), myUrl .getPath(), finishedSize); InputStream inputStream = socket.getInputStream(); // 分析HTTP响应消息头 analyzeHttpHeader(inputStream, de); contentLength = getFileLength(); if (finishedSize >= contentLength) return; else { if (finishedSize > 0 && responseCode.equals("200")) return; } if (responseCode.charAt(0) != '2') throw new Exception("不支持的响应码"); int n = 0; long m = finishedSize; while ((n = inputStream.read(buffer)) != -1) { fileOut.write(buffer, 0, n); m += n; if (contentLength != -1) { de.percent(m * 100 / contentLength); } } fileOut.close(); socket.close(); } }
package download; public interface DownloadEvent { void percent(long n); void state(String s); void viewHttpHeaders(String s); }
发表评论
-
redis安装(windows.exe)
2014-05-21 22:54 675https://github.com/rgl/redis ... -
rabbitMQ安装(windows下)
2014-05-21 22:41 614进入项目下载主页面http://www.rabbitmq.co ... -
实现单线程的断点下载
2014-04-16 09:43 797/** * 实现单线程的断点下载 */ publ ... -
实现一个简易的http模拟器
2014-04-15 15:20 1694/** * http模拟器 * 模拟发送http请求和 ... -
xml学习鉴定
2014-04-09 23:33 798实现招生录取系统中的 ... -
xml学习
2014-04-08 22:47 1434XML:Extensible Markup Langu ... -
java多线程-线程状态转换
2014-03-01 09:20 7381. 新建(new):新创建了一个线程对象。 2. 可 ... -
apt处理自定义annotation
2014-02-19 23:20 980package annotations; import ... -
跳过UTF-8的BOM
2014-02-14 12:19 1462/** version: 1.1 / 2007-01-25 ... -
java reference
2014-02-09 00:36 640import java.lang.ref.PhantomR ... -
不带头结点的单链表面试汇总
2014-01-24 13:47 1456import java.io.ByteArrayInputSt ... -
带头节点的单链表面试题汇总
2014-01-23 15:12 988import java.io.ByteArrayInput ... -
单链表面试题之-链表反转
2014-01-15 22:43 1064单链表反转 -------------------- ... -
java单链表-带头结点和不带头结点单链表的简单实现
2014-01-14 23:41 4884带头结点的单链表实现 public class LinkedL ... -
ClassLoader
2013-11-08 15:57 861public class ClassLoaderTest { ... -
URL和URI
2013-11-08 13:48 472private static void getData ... -
i++和++i
2013-11-06 15:26 492// i = i++ 计算过程 // temp = i; ... -
java 继承 多态
2013-11-06 15:19 761/** 运行结果: A's constructor co ... -
sealing violation
2013-11-03 16:10 3097一般以下两种情况会触发sealing安全异常 1)当被密封(s ... -
hashmap分析
2013-10-30 15:20 659/** hashmap底层维护着一个entry数组,每 ...
相关推荐
HTTP断点续传原理,另附上AS3+Flash Player+AIR制作的一个断点续传小程序源码
使用HTTP 协议中的断点续传功能传输文件,用java中的HttpURLConnection 进行开发
http 断点续传演示
主要断网、断电,等回复之后继续下载,效果很不错的,
相信新颖网络HTTP断点续传控件能够帮助您赢利市场。 版权所有 2009-2012 北京新颖网络 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-uploader3/index.aspx 在线演示...
java中http断点续传的原理
用 Java 实现断点续传 (HTTP),内容有: 断点续传的原理, Java 实现断点续传的关键几点, 断点续传内核的实现等。
HTTP断点续传和多线程下载,支持HTTP协议的断点续传和多通道下载
易语言HTTP断点续传源码.rar
JAVA实现HTTP断点续传[借鉴].pdf
android sdk 3.0 测试通过
易语言http断点续传源码,http断点续传,下载子程序,进度显示,HTTP进度下载,InternetGetConnectedState,InternetOpenA,InternetOpenUrlA,HttpQueryInfoA,InternetCloseHandle,InternetReadFile,CallWindowProcA
开发环境vs2008,语言C#,WinForm实现http下断点续传文件
http断点续传.rar
原理: ...2. 获得文件大小ftell, 格式化HTTP请求头 "Range: bytes=ftell -", 以偏移httpfile指针,实现断点续传 3. 获得要下载的文件,以二进制形式传输,OpenURL 4. 接收数据,防止阻塞PeekMessage
HTTP断点续传,文件下载 断点续传 简单实用
仿迅雷的多线程HTTP断点续传下载 (源码)
...现在大部分的用户有文件批量上传的需求,希望只通过点击一次鼠标就...相信新颖网络HTTP断点续传控件能够帮助您赢利市场。 产品介绍:[url=http://www.cnblogs.com/xproer/archive/2012/02/17/2355440.html][/url]
单线程断点续传,支持2G以上大文件,用它下载过完美世界的3G多的客户端。可下载文件名中含连续数字变化的多个文件。默认url是17173上吴艳樱的照片。当下载速率低于设定值时重新连接,因盛大永恒之塔客户端下载时速率...