ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:19.61KB ,
资源ID:20200684      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20200684.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(java断点续传技术.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

java断点续传技术.docx

1、java断点续传技术用 Java 实现断点续传 (HTTP)断点续传的原理其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 ,文件名为 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, */* Ac

2、cept-Language: zh-cnAccept-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-T

3、ype=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: NetFoxRANGE: bytes=2000070- Accept: text/html, image

4、/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=ap

5、plication/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. (1) 用什么方法实现提交 RANGE: bytes=2000070-。 当然用最原始的 Socket 是肯定能完成的,不过那样

6、太费事了,其实 Java 的 net 包中提供了这种功能。代码如下: URL url = new URL( HttpURLConnectionhttpConnection = (HttpURLConnection)url.openConnection(); / 设置 User-Agent httpConnection.setRequestProperty(User-Agent,NetFox); / 设置断点续传的开始位置 httpConnection.setRequestProperty(RANGE,bytes=2000070); / 获得输入流 InputStream input = htt

7、pConnection.getInputStream(); 从输入流中取出的字节流就是 down.zip 文件从 2000070 开始的字节流。大家看,其实断点续传用 Java 实现起来还是很简单的吧。接下来要做的事就是怎么保存获得的流到文件中去了。 2. 保存文件采用的方法。 我采用的是 IO 包中的 RandAccessFile 类。 操作相当简单,假设从 2000070 处开始保存文件,代码如下: RandomAccessoSavedFile = new RandomAccessFile(down.zip,rw); long nPos = 2000070; / 定位文件指针到 nPos

8、位置 oSavedFile.seek(nPos); byte b = new byte1024; intnRead; / 从输入流中读入字节流,然后写到文件中 while(nRead=input.read(b,0,1024) 0) oSavedFile.write(b,0,nRead); 怎么样,也很简单吧。接下来要做的就是整合成一个完整的程序了。包括一系列的线程控制等等。 回页首断点续传内核的实现主要用了 6 个类,包括一个测试类。 SiteFileFetch.java 负责整个文件的抓取,控制内部线程 (FileSplitterFetch 类 )。 FileSplitterFetch.ja

9、va 负责部分文件的抓取。 FileAccess.java 负责文件的存储。 SiteInfoBean.java 要抓取的文件的信息,如文件保存的目录,名字,抓取文件的 URL 等。 Utility.java 工具类,放一些简单的方法。 TestMethod.java 测试类。 下面是源程序:/* /* * SiteFileFetch.java */ package NetFox; import java.io.*; import .*; public class SiteFileFetch extends Thread SiteInfoBeansiteInfoBean = null; / 文

10、件信息 Bean long nStartPos; / 开始位置 long nEndPos; / 结束位置FileSplitterFetch fileSplitterFetch; / 子线程对象 long nFileLength; / 文件长度booleanbFirst = true; / 是否第一次取文件booleanbStop = false; / 停止标志 File tmpFile; / 文件下载的临时信息DataOutputStream output; / 输出到文件的输出流 public SiteFileFetch(SiteInfoBean bean) throws IOExcepti

11、on 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 longbean.getNSplitter(); nEndPos = new longbean.

12、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

13、i=0;inStartPos.length;i+) nStartPosi = (long)(i*(nFileLength/nStartPos.length); for(inti=0;inEndPos.length-1;i+) nEndPosi = nStartPosi+1; nEndPosnEndPos.length-1 = nFileLength; / 启动子线程fileSplitterFetch = new FileSplitterFetchnStartPos.length; for(inti=0;inStartPos.length;i+) fileSplitterFetchi = new

14、 FileSplitterFetch(siteInfoBean.getSSiteURL(), siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(), nStartPosi,nEndPosi,i); Utility.log(Thread + i + , nStartPos = + nStartPosi + , nEndPos = + nEndPosi); fileSplitterFetchi.start(); / fileSplitterFetchnPos.length-1 = new FileSpl

15、itterFetch(siteInfoBean.getSSiteURL(),siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),nPosnPos.length-1,nFileLength,nPos.length-1); / Utility.log(Thread +(nPos.length-1) + ,nStartPos = +nPosnPos.length-1+,nEndPos = + nFileLength); / fileSplitterFetchnPos.length-1.start();

16、/ 等待子线程结束 /int count = 0; / 是否结束 while 循环booleanbreakWhile = false; while(!bStop) write_nPos(); Utility.sleep(500); breakWhile = true; for(inti=0;i4) / siteStop(); System.err.println(文件下载结束!); catch(Exception e)e.printStackTrace (); / 获得文件长度 public long getFileSize() intnFileLength = -1; try URL url

17、 = new URL(siteInfoBean.getSSiteURL(); HttpURLConnectionhttpConnection = (HttpURLConnection)url.openConnection ();httpConnection.setRequestProperty(User-Agent,NetFox); intresponseCode=httpConnection.getResponseCode(); if(responseCode=400) processErrorCode(responseCode); return -2; /-2 represent acce

18、ss is error String sHeader; for(inti=1;i+) /DataInputStream in = new DataInputStream(httpConnection.getInputStream (); /Utility.log(in.readLine(); sHeader=httpConnection.getHeaderFieldKey(i); if(sHeader!=null) if(sHeader.equals(Content-Length) nFileLength = Integer.parseInt(httpConnection.getHeaderF

19、ield(sHeader); break; else break; catch(IOException e)e.printStackTrace (); catch(Exception e)e.printStackTrace (); Utility.log(nFileLength); return nFileLength; / 保存下载信息(文件指针位置) private void write_nPos() try output = new DataOutputStream(new FileOutputStream(tmpFile); output.writeInt(nStartPos.leng

20、th); for(inti=0;inStartPos.length;i+) / output.writeLong(nPosi); output.writeLong(fileSplitterFetchi.nStartPos); output.writeLong(fileSplitterFetchi.nEndPos); output.close(); catch(IOException e)e.printStackTrace (); catch(Exception e)e.printStackTrace (); / 读取保存的下载信息(文件指针位置) private void read_nPos(

21、) try DataInputStream input = new DataInputStream(new FileInputStream(tmpFile); intnCount = input.readInt(); nStartPos = new longnCount; nEndPos = new longnCount; for(inti=0;inStartPos.length;i+) nStartPosi = input.readLong(); nEndPosi = input.readLong(); input.close(); catch(IOException e)e.printSt

22、ackTrace (); catch(Exception e)e.printStackTrace (); private void processErrorCode(intnErrorCode) System.err.println(Error Code : + nErrorCode); / 停止文件下载 public void siteStop() bStop = true; for(inti=0;inStartPos.length;i+) fileSplitterFetchi.splitterStop(); /* *FileSplitterFetch.java */ package Net

23、Fox; import java.io.*; import .*; public class FileSplitterFetch extends Thread String sURL; /File URL long nStartPos; /File Snippet Start Position long nEndPos; /File Snippet End Position intnThreadID; /Threads ID booleanbDownOver = false; /Downing is over booleanbStop = false; /Stop identical File

24、AccessIfileAccessI = null; /File Access interface public FileSplitterFetch(String sURL,StringsName,longnStart,longnEnd,int id) throws IOException this.sURL = sURL; this.nStartPos = nStart; this.nEndPos = nEnd; nThreadID = id; fileAccessI = new FileAccessI(sName,nStartPos); public void run() while(nS

25、tartPos 0 &nStartPosnEndPos& !bStop) nStartPos += fileAccessI.write(b,0,nRead); /if(nThreadID = 1) / Utility.log(nStartPos = + nStartPos + , nEndPos = + nEndPos); Utility.log(Thread + nThreadID + is over!); bDownOver = true; /nPos = fileAccessI.write (b,0,nRead); catch(Exception e)e.printStackTrace

26、(); / 打印回应的头信息 public void logResponseHead(HttpURLConnection con) for(inti=1;i+) String header=con.getHeaderFieldKey(i); if(header!=null) /responseHeaders.put(header,httpConnection.getHeaderField(header); Utility.log(header+ : +con.getHeaderField(header); else break; public void splitterStop() bStop = true; /* *FileAccess.java */ package NetFox; import java.io.*; public class FileAccessI implements Serializable RandomAccessFileoSavedFile; long nPos; public FileAccessI() throws IOException this(,0); public FileAccessI(String sName,longnPos)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1