基于http协议的断点续传

上传人:第*** 文档编号:30602180 上传时间:2018-01-30 格式:DOC 页数:12 大小:58.50KB
返回 下载 相关 举报
基于http协议的断点续传_第1页
第1页 / 共12页
基于http协议的断点续传_第2页
第2页 / 共12页
基于http协议的断点续传_第3页
第3页 / 共12页
基于http协议的断点续传_第4页
第4页 / 共12页
基于http协议的断点续传_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《基于http协议的断点续传》由会员分享,可在线阅读,更多相关《基于http协议的断点续传(12页珍藏版)》请在金锄头文库上搜索。

1、一)断点续传的原理 其实断点续传的原理很简单,就是在 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, */* Accept-Language: zh-cn Accept

2、-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-str

3、eam 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,

4、 */*; 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 Ser

5、ver=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 包中提供了这种

6、功能。代码如下: URL url = new URL(http:/ HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection (); /设置 User-Agent httpConnection.setRequestProperty(User-Agent,NetFox); /设置断点续传的开始位置 httpConnection.setRequestProperty(RANGE,bytes=2000070); /获得输入流 InputStream input = httpConnection.getInputS

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

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

9、ss.java 负责文件的存储。 SiteInfoBean.java 要抓取的文件的信息,如文件保存的目录,名字,抓取文件的 URL 等。 Utility.java 工具类,放一些简单的方法。 TestMethod.java 测试类。 下面是源程序: Java 代码 1. /* 2. *SiteFileFetch.java 3. */4. packageNetFox; 5. importjava.io.*; 6. .*; 7. publicclassSiteFileFetchextendsThread 8. SiteInfoBeansiteInfoBean=null;/文件信息 Bean 9.

10、 longnStartPos;/开始位置 10. longnEndPos;/结束位置 11. FileSplitterFetchfileSplitterFetch;/子线程对象 12. longnFileLength;/文件长度 13. booleanbFirst=true;/是否第一次取文件 14. booleanbStop=false;/停止标志 15. FiletmpFile;/文件下载的临时信息 16. DataOutputStreamoutput;/输出到文件的输出流 17. publicSiteFileFetch(SiteInfoBeanbean)throwsIOException

11、 18. 19. siteInfoBean=bean; 20. /tmpFile=File.createTempFile(zhong,1111,newFile(bean.getSFilePath(); 21. tmpFile=newFile(bean.getSFilePath()+File.separator+bean.getSFileName()+.info); 22. if(tmpFile.exists() 23. 24. bFirst=false; 25. read_nPos(); 26. 27. else28. 29. nStartPos=newlongbean.getNSplitte

12、r(); 30. nEndPos=newlongbean.getNSplitter(); 31. 32. 33. publicvoidrun() 34. 35. /获得文件长度 36. /分割文件 37. /实例 FileSplitterFetch 38. /启动 FileSplitterFetch 线程 39. /等待子线程返回 40. try 41. if(bFirst) 42. 43. nFileLength=getFileSize(); 44. if(nFileLength=-1) 45. 46. System.err.println(FileLengthisnotknown!); 4

13、7. 48. elseif(nFileLength=-2) 49. 50. System.err.println(Fileisnotaccess!); 51. 52. else53. 54. for(inti=0;i4) 101. /siteStop(); 102. 103. System.err.println(文件下载结束!); 104. 105. catch(Exceptione)e.printStackTrace(); 106. 107. /获得文件长度 108. publiclonggetFileSize() 109. 110. intnFileLength=-1; 111. try

14、 112. URLurl=newURL(siteInfoBean.getSSiteURL(); 113. HttpURLConnectionhttpConnection=(HttpURLConnection)url.openConnection(); 114. httpConnection.setRequestProperty(User-Agent,NetFox); 115. intresponseCode=httpConnection.getResponseCode(); 116. if(responseCode=400) 117. 118. processErrorCode(respons

15、eCode); 119. return-2;/-2representaccessiserror 120. 121. StringsHeader; 122. for(inti=1;i+) 123. 124. /DataInputStreamin=newDataInputStream(httpConnection.getInputStream(); 125. /Utility.log(in.readLine(); 126. sHeader=httpConnection.getHeaderFieldKey(i); 127. if(sHeader!=null) 128. 129. if(sHeader.equals(Content-Length) 130. 131. nFileLength=Integer.parseInt(httpConnection.getHeaderField(sHeader); 132. break; 133. 134. 135. else136. break; 137. 138. 139. catch(IOExceptione)e.printStackTrace(); 140. catch(Exceptione)e.printStackTrace(); 141. Utility.log(n

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 外语文库 > 英语学习

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号