- 浏览: 114438 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (135)
- java (135)
- [转]c# 画圆角矩形 (1)
- 设计模式生活实例 (1)
- .nET2.0小技巧 (1)
- 从另一个角度看敏捷实践(一)--IPM:承诺的仪式 (1)
- javascript字符串转json对象 (1)
- 使用BeanUtils时,Date类型值为空的解决方法 (1)
- Lenovo V460+Ubuntu 11.10 无线网问题 (1)
- Lucene 索引和搜索过程核心类详解 (1)
- Android短信编解码方式 (1)
- 股神巴菲特十大致富秘籍 (1)
- Map遍历的三种方法 (1)
- Android中用Toast.cancel()方法优化toast内容的显示 (1)
- ViewFlipper “Receiver not registered” Error (1)
- javax.xml.transform.TransformerFactoryConfigurationError (1)
- JNI调用的注意事项 (1)
- JUnit单元测试感悟 (1)
- 用C#写定时关机的程序 (1)
- ASP.NET开发工具Web Matrix介绍 (1)
- MapXtreme2004代码 MapControl控件中显示地图文件 (1)
- 《使用 Microsoft .NET 的企业解决方案模式》读书笔记3 (1)
- 微创短信开发平台 (1)
- 谈谈Q+平台的技术实现 (1)
- 手机防盗软件实现(源码) (1)
- 虚析构函数(总结 帖子) (1)
- c语言中去除const修饰 (1)
- ORA-01012: not logged on 解决办法 (1)
- paypal提现如何省钱 (1)
- 数独suduku (1)
- MyISAM InnoDB 区别 (1)
- 随 笔 (1)
- Android上的log,日志相关 (1)
- 百度质量部实习居然通过了~ (1)
最新评论
-
野狐禅:
ext.get('imagebrowse') is null
ExtJs上传图片预览功能 -
zhuyl_wind:
不切实际,呵呵
[]5年内买车买房-理财篇 -
in南京:
关键你那两千块钱就够交一个多月的房租!换个城市你那六百也远远不 ...
[]5年内买车买房-理财篇 -
javac_xinyun:
呵呵,看完了,确实不错,貌似第一年的房租每月算进去 ,人际关系 ...
[]5年内买车买房-理财篇 -
dishikun:
貌似很不错,就是没把房租算进去!
[]5年内买车买房-理财篇
<span style="color: #000000;">网上类似的文章很多,参考了很多人的,大部分人都是用urlconnection写的。</span>
<h3><span style="color: #0000ff;">原理一:http多线程下载原理</span></h3>1、发送一个含有rang头的head请求,如果返回状态码为206,则允许多线程下载
<h3><span style="color: #0000ff;">原理二:多线程下载原理</span></h3>1、使用httpclient的head请求获取请求文件的信息
2、发送一个rang的head请求判断是否允许多线程下载
3、通过主任务创建多个分段下载线程,分段下载文件,然后用java的随机读写文件类保存下载的内容
(等有时间了再添加内容吧,先简单写这么多)
<h4><span style="color: #ff0000;">调度功能代码片段</span></h4>
2、download.zip为eclipse项目文件
3、运行截图<br><img src="http://dl.iteye.com/upload/attachment/423030/ecf09679-708a-3351-9b60-9697ff2f6fd8.jpg" alt=""><br>
<h3><span style="color: #0000ff;">原理一:http多线程下载原理</span></h3>1、发送一个含有rang头的head请求,如果返回状态码为206,则允许多线程下载
<h3><span style="color: #0000ff;">原理二:多线程下载原理</span></h3>1、使用httpclient的head请求获取请求文件的信息
2、发送一个rang的head请求判断是否允许多线程下载
3、通过主任务创建多个分段下载线程,分段下载文件,然后用java的随机读写文件类保存下载的内容
(等有时间了再添加内容吧,先简单写这么多)
<h4><span style="color: #ff0000;">调度功能代码片段</span></h4>
/** * 开始下载 * @throws exception */ public void startdown() throws exception{ httpclient httpclient = new defaulthttpclient(); try { //获取下载文件信息 getdownloadfileinfo(httpclient); //启动多个下载线程 startdownloadthread(); //开始监视下载数据 monitor(); } catch (exception e) { throw e; } finally { httpclient.getconnectionmanager().shutdown(); } } /** * 获取下载文件信息 */ private void getdownloadfileinfo(httpclient httpclient) throws ioexception, clientprotocolexception, exception { httphead httphead = new httphead(url); httpresponse response = httpclient.execute(httphead); //获取http状态码 int statuscode = response.getstatusline().getstatuscode(); if(statuscode != 200) throw new exception("资源不存在!"); if(getdebug()){ for(header header : response.getallheaders()){ system.out.println(header.getname()+":"+header.getvalue()); } } //content-length header[] headers = response.getheaders("content-length"); if(headers.length > 0) contentlength = long.valueof(headers[0].getvalue()); httphead.abort(); httphead = new httphead(url); httphead.addheader("range", "bytes=0-"+(contentlength-1)); response = httpclient.execute(httphead); if(response.getstatusline().getstatuscode() == 206){ acceptranges = true; } httphead.abort(); } /** * 启动多个下载线程 * @throws ioexception * @throws filenotfoundexception */ private void startdownloadthread() throws ioexception, filenotfoundexception { //创建下载文件 file file = new file(localpath); file.createnewfile(); randomaccessfile raf = new randomaccessfile(file, "rw"); raf.setlength(contentlength); raf.close(); //定义下载线程事件实现类 downloadthreadlistener listener = new downloadthreadlistener() { public void afterperdown(downloadthreadevent event) { //下载完一个片段后追加已下载字节数 synchronized (object) { downloadtask.this.receivedcount += event.getcount(); } } public void downcompleted(downloadthreadevent event) { //下载线程执行完毕后从主任务中移除 threads.remove(event.gettarget()); if(getdebug()){ system.out.println("剩余线程数:"+threads.size()); } } }; //不支持多线程下载时 if (!acceptranges) { if(getdebug()){ system.out.println("该地址不支持多线程下载"); } //定义普通下载 downloadthread thread = new downloadthread(url, 0, contentlength, file, false); thread.adddownloadlistener(listener); thread.start(); threads.add(thread); return; } //每个请求的大小 long perthreadlength = contentlength / threadcount + 1; long startposition = 0; long endposition = perthreadlength; //循环创建多个下载线程 do{ if(endposition >= contentlength) endposition = contentlength - 1; downloadthread thread = new downloadthread(url, startposition, endposition, file); thread.adddownloadlistener(listener); thread.start(); threads.add(thread); startposition = endposition + 1;//此处加 1,从结束位置的下一个地方开始请求 endposition += perthreadlength; } while (startposition < contentlength); }<h4><span style="color: #ff0000;"> 分段下载线程代码片段:</span></h4>
/** * 现在过程代码 */ public void run() { if(downloadtask.getdebug()){ system.out.println("start:" + startposition + "-" +endposition); } httpclient httpclient = new defaulthttpclient(); try { httpget httpget = new httpget(url); if(isrange){//多线程下载 httpget.addheader("range", "bytes="+startposition+"-"+endposition); } httpresponse response = httpclient.execute(httpget); int statuscode = response.getstatusline().getstatuscode(); if(downloadtask.getdebug()){ for(header header : response.getallheaders()){ system.out.println(header.getname()+":"+header.getvalue()); } system.out.println("statuscode:" + statuscode); } if(statuscode == 206 || (statuscode == 200 && !isrange)){ inputstream inputstream = response.getentity().getcontent(); //创建随机读写类 randomaccessfile outputstream = new randomaccessfile(file, "rw"); //跳到指定位置 outputstream.seek(startposition); int count = 0;byte[] buffer=new byte[1024]; while((count = inputstream.read(buffer, 0, buffer.length))>0){ outputstream.write(buffer, 0, count); //触发下载事件 fireafterperdown(new downloadthreadevent(this,count)); } outputstream.close(); } httpget.abort(); } catch (exception e) { e.printstacktrace(); } finally { //触发下载完成事件 firedowncompleted(new downloadthreadevent(this, endposition)); if(downloadtask.getdebug()){ system.out.println("end:" + startposition + "-" +endposition); } httpclient.getconnectionmanager().shutdown(); } }<h4> 附件说明:</h4>1、download.jar为编译好的可运行程序
2、download.zip为eclipse项目文件
3、运行截图<br><img src="http://dl.iteye.com/upload/attachment/423030/ecf09679-708a-3351-9b60-9697ff2f6fd8.jpg" alt=""><br>
发表评论
-
百度质量部实习居然通过了~
2012-02-08 12:23 952[size=small;]? ? ?本来打算在软工所苦 ... -
Android上的log,日志相关
2012-02-07 14:18 1481摘自:http://blog.csdn.net/met ... -
随 笔
2012-02-04 13:39 561金风玉露一相逢,便胜却人间无数。英文版: chemis ... -
MyISAM InnoDB 区别
2012-02-02 16:59 695<h1 id="artibody ... -
数独suduku
2012-01-31 14:38 878sudu sudu sudu sudu sudu su ... -
paypal提现如何省钱
2011-12-28 16:58 1173据PayPal中文注册得知,如今很多收样品费的外贸商户 ... -
ORA-01012: not logged on 解决办法
2011-12-28 13:08 3412<span style="font-f ... -
c语言中去除const修饰
2011-12-21 10:54 1375[size=16px;]<span style= ... -
虚析构函数(总结 帖子)
2011-12-21 09:54 669<span style="" ... -
手机防盗软件实现(源码)
2011-12-20 12:54 911<a href="http://blo ... -
谈谈Q+平台的技术实现
2011-12-20 09:49 929这篇文章是我个人 ... -
微创短信开发平台
2011-12-19 11:39 733在网上闲逛,发现了一个站点,微创短信开发平台(http ... -
《使用 Microsoft .NET 的企业解决方案模式》读书笔记3
2011-12-19 10:24 712第3章 Web表示模式 没有一个设计策略能够适合所有情 ... -
MapXtreme2004代码 MapControl控件中显示地图文件
2011-12-15 14:29 849::<?xml:namespace prefix ... -
ASP.NET开发工具Web Matrix介绍
2011-12-15 13:39 929<p class="MsoPlain ... -
用C#写定时关机的程序
2011-12-15 11:14 669</span></font>& ... -
JUnit单元测试感悟
2011-12-14 11:29 827<p class="MsoNorma ... -
JNI调用的注意事项
2011-12-14 09:34 715JNI的简单教程网上很多,看看就能够明白,照着操作也基 ... -
javax.xml.transform.TransformerFactoryConfigurationError
2011-12-13 13:34 807<span style="" ... -
ViewFlipper “Receiver not registered” Error
2011-12-12 10:59 1093偶尔出现这个错误: <span> < ...
相关推荐
apache httpclient jar包
apache httpclient document apache httpcore document
主要介绍了使用java的HttpClient实现多线程并发的相关资料,需要的朋友可以参考下
apache HttpClient jar包
NULL 博文链接:https://eric-wyf.iteye.com/blog/1179729
目录前言正文OkHttp使用示例源码解析Apache HttpClient使用示例源码解析GoogleHttpClient哪个更香?总结声明 前言 前八篇文章介绍完了feign-core核心内容,从本篇开始将介绍它的“其它模块”。其实核心模块可以独立...
Apache httpclient 4.5.12版本源码,不包含jar包。适合学习原理,查看各种接口的实现。
5、多线程下载-断点续传:使用临时文件记录当前下载的数据,下次读取文件开始下载 6、下载显示进度条-ProgressBar 7、在gitbub上面下载已经有支持断点续传功能的代码HttpUtils 8、源码关联-技巧,非常重要:
本实例描述了Android平台下使用Apache开源项目的HttpClient访问网络的示例。分别使用HttpClient下的两个子实现类,DefaultHttpClient和AndroidHttpClient分别进行演示。
org.apache httpclient 4.5源代码,通过eclipse代码项目代码后可以直接查看httpclient源代码,与您的工程代码关连起来。
通过HttpClient实现远程下载,本例子通过java代码实现
wechatpay-apache-httpclient-0.2.1.jar
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....
用HttpClient实现文件下载需要满足:有一台web服务器,要下载的源文件需存放在web服务器的特定目录下。通过发起http请求实现文件下载功能。
apache httpclient 源码和 jar包 源码不是反编译的
这个比xutils强多了。用过服务端交互框架的都知道
如果你是使用Apache HttpClient的商户开发者,可以使用它构造HttpClient。得到的HttpClient在执行请求时将自动携带身份认证信息,并检查应答的微信支付签名。 项目状态 当前版本0.2.2为测试版本。请商户的专业技术...