当前位置:  技术问答>java相关

java中如何利用http断点续传的原理下载http://www.9sky.com/上的mp3,现在那只能用netant才能正确下载。这是为什么呢?请高手指点。

    来源: 互联网  发布时间:2015-01-26

    本文导语:  | 如果你比较细心的话,你会发现当用蚂蚁下载的时候,如果把提交者(Referer)属性清空,则用蚂蚁也不能下载了,下载下来的是提醒你的JPG图片…… 因为下载的时候,服务器会读取你的Referer属性,然后判断这...


|
如果你比较细心的话,你会发现当用蚂蚁下载的时候,如果把提交者(Referer)属性清空,则用蚂蚁也不能下载了,下载下来的是提醒你的JPG图片……
因为下载的时候,服务器会读取你的Referer属性,然后判断这个属性指向的网址是否属于他的域,是才让你下载,所以,用JAVA写下载程序的时候,记得把这个属性提交就行了……
只需要这样就行:Referer: http://www.9sky.com/9sky2/cd/adddown.asp

根据上面文章中的设置方法,加上这一句就OK了:
httpConnection.setRequestProperty("Referer","http://www.9sky.com/9sky2/cd/adddown.asp");
我还没有试过,不过应该可以的……你试试,不行再说一下,我再看看……

|
可能有如下几个原因:
一。NetAnts有自己的连接方式,9SKY对其作了特别分析,只让NetAnts或FlashGet下载
二。注意Refer页,9SKY一般是用右键菜单选择"用…下载"进行下载的,这样FlashGet等就会在下载时向服务器发送这个下载URL是从哪个页面得来的,服务器检查它是不是合法的。

|
其实原理很简单,只是在 http 请求中加一个文件的偏移量而已,当然这还需要 server 支持这个头才行。
手头上刚好有一篇这样的文档。

(一)断点续传的原理
其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。
打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:
假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。
GET /down.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive


服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:


200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT

 

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给
Web服务器的时候要多加一条信息--从哪里开始。
下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。
GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2


仔细看一下就会发现多了一行RANGE: bytes=2000070-
这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。
服务器收到这个请求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT


和前面服务器返回的信息比较一下,就会发现增加了一行:
Content-Range=bytes 2000070-106786027/106786028
返回的代码也改为206了,而不再是200了。


知道了以上原理,就可以进行断点续传的编程了。


(二)Java实现断点续传的关键几点


(1)用什么方法实现提交RANGE: bytes=2000070-。
当然用最原始的Socket是肯定能完成的,不过那样太费事了,其实Java的net包中提供了这种功能。代码如下:
URL url = new URL("http://www.sjtu.edu.cn/down.zip");
HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection

 

();
//设置User-Agent
httpConnection.setRequestProperty("User-Agent","NetFox");
//设置断点续传的开始位置
httpConnection.setRequestProperty("RANGE","bytes=2000070");
//获得输入流
InputStream input = httpConnection.getInputStream();


从输入流中取出的字节流就是down.zip文件从2000070开始的字节流。
大家看,其实断点续传用Java实现起来还是很简单的吧。
接下来要做的事就是怎么保存获得的流到文件中去了。


保存文件采用的方法。
我采用的是IO包中的RandAccessFile类。
操作相当简单,假设从2000070处开始保存文件,代码如下:
RandomAccess oSavedFile = new RandomAccessFile("down.zip","rw");
long nPos = 2000070;
//定位文件指针到nPos位置
oSavedFile.seek(nPos);
byte[] b = new byte[1024];
int nRead;
//从输入流中读入字节流,然后写到文件中
while((nRead=input.read(b,0,1024)) > 0)
{
oSavedFile.write(b,0,nRead);
}

怎么样,也很简单吧。
接下来要做的就是整合成一个完整的程序了。包括一系列的线程控制等等。



(三)断点续传内核的实现
主要用了6个类,包括一个测试类。
SiteFileFetch.java负责整个文件的抓取,控制内部线程(FileSplitterFetch类)。
FileSplitterFetch.java负责部分文件的抓取。
FileAccess.java负责文件的存储。
SiteInfoBean.java要抓取的文件的信息,如文件保存的目录,名字,抓取文件的URL等。
Utility.java工具类,放一些简单的方法。
TestMethod.java测试类。


下面是源程序: 
/*
**SiteFileFetch.java
*/
package NetFox;
import java.io.*;
import java.net.*;


public class SiteFileFetch extends Thread {


SiteInfoBean siteInfoBean = null; //文件信息Bean
long[] nStartPos; //开始位置
long[] nEndPos; //结束位置
FileSplitterFetch[] fileSplitterFetch; //子线程对象
long nFileLength; //文件长度
boolean bFirst = true; //是否第一次取文件
boolean bStop = false; //停止标志
File tmpFile; //文件下载的临时信息
DataOutputStream output; //输出到文件的输出流


public SiteFileFetch(SiteInfoBean bean) throws IOException
{
siteInfoBean = bean;
//tmpFile = File.createTempFile ("zhong","1111",new File(bean.getSFilePath()));
tmpFile = new File(bean.getSFilePath()+File.separator + bean.getSFileName()+".info");
if(tmpFile.exists ())
{
bFirst = false;
read_nPos();
}
else
{
nStartPos = new long[bean.getNSplitter()];
nEndPos = new long[bean.getNSplitter()];
}



}


public void run()
{
//获得文件长度
//分割文件
//实例FileSplitterFetch
//启动FileSplitterFetch线程
//等待子线程返回
try{
if(bFirst)
{
nFileLength = getFileSize();
if(nFileLength == -1)
{
System.err.println("File Length is not known!");
}
else if(nFileLength == -2)
{
System.err.println("File is not access!");
}
else
{
for(int i=0;i

    
 
 

您可能感兴趣的文章:

  • Apache HTTP Server(httpd)下载安装以及如何配置java(tomcat)和php详细介绍
  • 听说在solaris上运行java飞快,solaris有多大,如果不大,我想下载,哪有下载?
  • 请问:哪里有下载Visibroker for java?我找到了两个地方,但是无法下载?(在线等待)
  • 请问scjp高手,在那里能下载java认证模拟试题(提供试题者下载的均有分)
  • 在哪儿下载sun公司的java的apis文档,清给出具体的下载地址号么,谢谢
  • 哪有jsdk2.0(java servlet development kit,not jdk)下载,具体的HTML下载路径,先谢了。
  • 哪有jvm(java虚拟机)下载,为了让ie运行一些java程序!
  • java初手,请问到那里下载java在ie下面的插件,让ie可以运行applet
  • 你最喜欢去的JAVA网站或JAVA源代码下载网站是哪里???
  • 请问哪里有java docs 的下载,中文版的,它是java的类库手册么?
  • 请教各位DX,我是java初学者,如何在win98下配置jdk,在哪可以下载java类库?
  • 求教JAVA高手:哪里可以下载(Visual JAVA 3)的教科书?...
  • 我是一名JAVA初学者,请问哪里有比较好的JAVA的源程序下载
  • 大家好,我下载的j2sdk1.4标准版里面怎么不包括,java.servlet和java.security呀?
  • 高分相赠!!!!!哪里下载运行Java程序的JVM?
  • 请问那里能下载JAVA?
  • 在那里下载java2的类库
  • 你认为最好的中文JAVA网站或有大量优秀JAVA源代码免费下载的网站是哪里???送分!!!
  • 请问哪里有java下载,也可以给我推荐几本好的java的书,不一定是电子书,不过有更好。
  • 下载Java大全
  • 我是JAVA初学者,看到SUN网站上面有很多JAVA的SDK下载,请问我应该下哪一个呢?
  • 老问题:如何用java实现ftp断点续传(要原码)急!!
  • Java中 URL实现断点下载
  • java断点续传功能实例(java获取远程文件)
  • 命令行使用支持断点续传的java多线程下载器
  • 使用java实现http多线程断点下载文件(二)
  • Java如何实现HTTP断点续传功能
  • 各位大大仙,请教使用java做ftp的断点续传程序!!
  • 使用java实现http多线程断点下载文件(一)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.xml.ws.http接口httpbinding成员方法: http_binding定义参考
  • 为什么输http://www.china-java.net,会自动改为http://www.china-java.net:8081?
  • java命名空间java.net枚举proxy.type的类成员方法: http定义及介绍
  • docker中文入门学习手册 iis7站长之家
  • java命名空间javax.print.attribute.standard类referenceurischemessupported的类成员方法: http定义及介绍
  • Java HTTP客户端 http4j
  • java命名空间java.net类httpurlconnection的类成员方法: http_accepted定义及介绍
  • MM求助:怎样多线程下载http://java.sun.com上的东东? 用http方式,谢谢了.
  • java命名空间java.net类httpurlconnection的类成员方法: http_unauthorized定义及介绍
  • JCreator里为什么找不到java.servlet.* java.servlet.http.* 类 ,求助!
  • java命名空间java.net类httpurlconnection的类成员方法: http_created定义及介绍
  • 我按cn-java上实战EJB做的第一个EJB例子(最简单的),最后运行http://localhost:6888/hello/servlet/HelloServlet,结果提示“Http:404
  • java命名空间java.net类httpurlconnection的类成员方法: http_forbidden定义及介绍
  • Java HTTP 服务器 Reattore
  • java命名空间java.net类httpurlconnection的类成员方法: http_gone定义及介绍
  • 请问用javac编译一般*.java能通过,但不能编译Servlet写的*.java.提示javax.servlet.http不存在。
  • java命名空间java.net类httpurlconnection的类成员方法: http_ok定义及介绍
  • 嵌入式 Java HTTP引擎 AsyncWeb
  • java命名空间java.net类httpurlconnection的类成员方法: http_conflict定义及介绍
  • Ym Java HTTP Transfer
  • java命名空间java.net类httpurlconnection的类成员方法: http_reset定义及介绍
  • 怎样在一个JAVA应用程序里,向一个SERVLET发出HTTP请求(带参数)???
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3