- 浏览: 55873 次
- 性别:
- 来自: 杭州
最新评论
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 745https://github.com/rgl/redis ... -
rabbitMQ安装(windows下)
2014-05-21 22:41 676进入项目下载主页面http://www.rabbitmq.co ... -
实现单线程的断点下载
2014-04-16 09:43 848/** * 实现单线程的断点下载 */ publ ... -
实现一个简易的http模拟器
2014-04-15 15:20 1811/** * http模拟器 * 模拟发送http请求和 ... -
xml学习鉴定
2014-04-09 23:33 846实现招生录取系统中的 ... -
xml学习
2014-04-08 22:47 1476XML:Extensible Markup Langu ... -
java多线程-线程状态转换
2014-03-01 09:20 8031. 新建(new):新创建了一个线程对象。 2. 可 ... -
apt处理自定义annotation
2014-02-19 23:20 1028package annotations; import ... -
跳过UTF-8的BOM
2014-02-14 12:19 1508/** version: 1.1 / 2007-01-25 ... -
java reference
2014-02-09 00:36 679import java.lang.ref.PhantomR ... -
不带头结点的单链表面试汇总
2014-01-24 13:47 1500import java.io.ByteArrayInputSt ... -
带头节点的单链表面试题汇总
2014-01-23 15:12 1033import java.io.ByteArrayInput ... -
单链表面试题之-链表反转
2014-01-15 22:43 1107单链表反转 -------------------- ... -
java单链表-带头结点和不带头结点单链表的简单实现
2014-01-14 23:41 4935带头结点的单链表实现 public class LinkedL ... -
ClassLoader
2013-11-08 15:57 916public class ClassLoaderTest { ... -
URL和URI
2013-11-08 13:48 519private static void getData ... -
i++和++i
2013-11-06 15:26 530// i = i++ 计算过程 // temp = i; ... -
java 继承 多态
2013-11-06 15:19 809/** 运行结果: A's constructor co ... -
sealing violation
2013-11-03 16:10 3149一般以下两种情况会触发sealing安全异常 1)当被密封(s ... -
hashmap分析
2013-10-30 15:20 698/** hashmap底层维护着一个entry数组,每 ...
相关推荐
下面将详细介绍HTTP断点续传的工作原理、实现方式以及相关的应用。 1. **HTTP协议基础**: HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从Web服务器传输超文本文档到浏览器。它基于TCP/IP通信...
### Http断点续传原理及Flex实现技术 #### 一、Http断点续传原理 在探讨具体的实现之前,我们先来理解下断点续传的基本原理。断点续传功能已经成为现代网络应用中的一项重要特性,尤其是在文件传输领域。其核心...
### HTTP断点续传技术详解及Java实现案例 #### 一、HTTP断点续传概述 HTTP断点续传是一种在网络通信中常见的技术,主要用于在文件传输过程中支持暂停与恢复的功能,尤其适用于大文件的传输场景。通过该技术,用户...
在实际应用中,开发者可能会使用各种编程语言和库来实现HTTP断点续传功能,例如在Python中可以使用`requests`库,在Java中可以使用`HttpURLConnection`,在C#中则可以利用`HttpClient`。这些库通常都提供了设置请求...
在Android开发中,HTTP断点续传是一项重要的技术,它允许用户在下载大文件时中断并稍后继续,而不需要重新下载整个文件。这在移动网络环境下尤其有用,因为网络连接可能会不稳定。以下是对这个主题的详细解释: 一...
在本文中,我们将深入探讨如何使用C# WinForm来实现HTTP断点续传下载功能。在VS2008开发环境中,C#提供了一个强大的框架,使得开发这种功能变得相对简单。断点续传是一种非常实用的技术,尤其在处理大文件下载时,...
《Ants.zip:HTTP断点续传与多线程下载技术详解》 在现代网络环境中,文件下载是一项常见的操作,而高效、稳定的下载方式尤为重要。本文将深入探讨Ants.zip中涉及的HTTP断点续传和多线程下载技术,这两种技术在提高...
QT HTTP断点续传下载是一种在HTTP协议基础上实现的文件下载技术,允许用户在中断下载后从上次停止的位置继续下载,极大地提高了下载效率和用户体验。本文将深入探讨这个主题,并结合给定的资源"QTDownLoad"来讲解...
本资源“易语言HTTP断点续传源码.rar”是一个针对HTTP协议实现的断点续传功能的源代码包,适用于软件开发,特别是涉及到文件下载和上传的场景。 HTTP断点续传是一种提高文件传输效率和可靠性的重要技术。在传统的...
在大型文件下载的场景中,HTTP断点续传和多线程下载技术是提高下载效率和用户体验的重要手段。 **HTTP断点续传** HTTP断点续传允许用户在中断下载后,从上次停止的地方继续下载,而无需重新开始。这在处理大文件...
相信新颖网络HTTP断点续传控件能够帮助您赢利市场。 版权所有 2009-2012 北京新颖网络 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-uploader3/index.aspx 在线演示...
《易语言真正HTTP断点续传下载》是末日工作室发布的一款开源下载工具,它具有强大的功能和灵活性,尤其在处理大文件下载时,能够实现断点续传,提高下载效率,减少网络资源的浪费。易语言作为中国本土化的一种编程...
Java 实现HTTP断点续传是一项在网络编程中非常实用的技术,尤其在大文件下载时能够提高用户体验,因为用户可以中断下载并在稍后从上次中断的地方继续。以下将详细讲解断点续传的原理以及如何使用Java来实现。 断点...
【标题】"仿迅雷的多线程HTTP断点续传下载"是一个编程项目,旨在实现类似迅雷的高效下载功能。迅雷是一款知名的下载工具,以其强大的多线程、断点续传特性著称。这个项目的目标是通过源码实现这样的特性,使得用户...
### 扩展HTTP断点续传各类文件:深入解析与应用 #### 一、断点续传技术概览 断点续传技术是文件下载领域的一项重要创新,它允许在下载过程中因网络不稳定或计算机断电等原因中断后,能够从断点处继续下载,而无需...
本项目“多线程断点续传(基于HTTP协议)”就是这样一个解决方案,它利用HTTP协议实现了断点续传功能,并通过多线程技术提升了上传效率。 首先,我们要理解什么是断点续传。断点续传是一种文件传输机制,允许用户在...
在IT行业中,HTTP断点续传是一项非常实用的技术,尤其对于大文件的下载而言。它允许用户在因网络问题中断下载后,从上次中断的位置继续下载,而不是重新开始。Java作为广泛使用的编程语言,提供了丰富的库和API来...