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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

用Java实现HTTP断点续传功能Word文档格式.docx

1、Last-Modified=Mon, 30 Apr 2001 12:所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给Web服务器的时候要多加一条信息-从哪里开始。下面是用自己编的一个浏览器来传递请求信息给Web服务器,要求从2000070字节开始。GET /down.zip HTTP/1.0 NetFoxRANGE: bytes=2000070- text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2仔细看一下就会发现多了一行RANGE:这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,

2、前面的字节不用传了。服务器收到这个请求以后,返回的信息如下:206Content-Range=bytes 2000070-106786027/10678602855:20 GMT和前面服务器返回的信息比较一下,就会发现增加了一行:返回的代码也改为206了,而不再是200了。知道了以上原理,就可以进行断点续传的编程了。(二)Java实现断点续传的关键几点 (1)用什么方法实现提交RANGE: bytes=2000070-。当然用最原始的Socket是肯定能完成的,不过那样太费事了,其实Java的net包中提供了这种功能。代码如下:URL url = new URL(HttpURLConnecti

3、on httpConnection = (HttpURLConnection)url.openConnection();/设置User-AgenthttpConnection.setRequestProperty(User-Agent,NetFox);/设置断点续传的开始位置RANGEbytes=2000070/获得输入流InputStream input = httpConnection.getInputStream();从输入流中取出的字节流就是down.zip文件从2000070开始的字节流。大家看,其实断点续传用Java实现起来还是很简单的吧。接下来要做的事就是怎么保存获得的流到文件中

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

5、;怎么样,也很简单吧。接下来要做的就是整合成一个完整的程序了。包括一系列的线程控制等等。(三)断点续传内核的实现主要用了6个类,包括一个测试类。SiteFileFetch.java负责整个文件的抓取,控制内部线程(FileSplitterFetch类)。FileSplitterFetch.java负责部分文件的抓取。FileAccess.java负责文件的存储。SiteInfoBean.java要抓取的文件的信息,如文件保存的目录,名字,抓取文件的URL等。Utility.java工具类,放一些简单的方法。TestMethod.java测试类。下面是源程序: /*SiteFileFetch.j

6、ava*/package NetFox;import java.io.*;import .*;public class SiteFileFetch extends Thread SiteInfoBean siteInfoBean = null; /文件信息Beanlong nStartPos; /开始位置long nEndPos; /结束位置FileSplitterFetch fileSplitterFetch; /子线程对象long nFileLength; /文件长度boolean bFirst = true; /是否第一次取文件boolean bStop = false; /停止标志Fi

7、le tmpFile; /文件下载的临时信息DataOutputStream output; /输出到文件的输出流public SiteFileFetch(SiteInfoBean bean) throws IOExceptionsiteInfoBean = bean;/tmpFile = File.createTempFile (zhong1111,new File(bean.getSFilePath();tmpFile = new File(bean.getSFilePath()+File.separator + bean.getSFileName()+.infoif(tmpFile.ex

8、ists ()bFirst = false;read_nPos();elsenStartPos = new longbean.getNSplitter();nEndPos = new longbean.getNSplitter();public void run()/获得文件长度/分割文件/实例FileSplitterFetch/启动FileSplitterFetch线程/等待子线程返回tryif(bFirst)nFileLength = getFileSize();if(nFileLength = -1)System.err.println(File Length is not known!

9、else if(nFileLength = -2)File is not access!for(int i=0;i<nStartPos.length;i+)nStartPosi = (long)(i*(nFileLength/nStartPos.length);nEndPos.length-1;nEndPosi = nStartPosi+1;nEndPosnEndPos.length-1 = nFileLength;/启动子线程fileSplitterFetch = new FileSplitterFetchnStartPos.length;fileSplitterFetchi = ne

10、w 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 FileSplitte

11、rFetch(siteInfoBean.getSSiteURL(),siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),nPosnPos.length-1,nFileLength,nPos.length-1);/ Utility.log( + (nPos.length-1) + + nPosnPos.length-1 + ,nEndPos = + nFileLength);/ fileSplitterFetchnPos.length-1.start();/等待子线程结束/int count = 0

12、;/是否结束while循环boolean breakWhile = false;while(!bStop)write_nPos();Utility.sleep(500);breakWhile = true;if(!fileSplitterFetchi.bDownOver)breakWhile = false;break;if(breakWhile)/count+;/if(count&4)/ siteStop();文件下载结束!catch(Exception e)e.printStackTrace ();public long getFileSize()int nFileLength = -1;

13、URL url = new URL(siteInfoBean.getSSiteURL();HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection ();int responseCode=httpConnection.getResponseCode();if(responseCode&=400)processErrorCode(responseCode);return -2; /-2 represent access is errorString sHeader;for(int i=1;/DataInput

14、Stream 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.getHeaderField(sHeader);catch(IOException e)e.printStackTrace ();Uti

15、lity.log(nFileLength);return nFileLength;/保存下载信息(文件指针位置)private void write_nPos()output = new DataOutputStream(new FileOutputStream(tmpFile);output.writeInt(nStartPos.length);/ output.writeLong(nPosi);output.writeLong(fileSplitterFetchi.nStartPos);output.writeLong(fileSplitterFetchi.nEndPos);output.

16、close();/读取保存的下载信息(文件指针位置)private void read_nPos()DataInputStream input = new DataInputStream(new FileInputStream(tmpFile);int nCount = input.readInt();nStartPos = new longnCount;nEndPos = new longnCount;nStartPosi = input.readLong();nEndPosi = input.readLong();input.close();private void processErro

17、rCode(int nErrorCode)Error Code : + nErrorCode);/停止文件下载public void siteStop()bStop = true;fileSplitterFetchi.splitterStop();*FileSplitterFetch.javapublic class FileSplitterFetch extends Thread String sURL; /File URLlong nStartPos; /File Snippet Start Positionlong nEndPos; /File Snippet End Positioni

18、nt nThreadID; /Threads IDboolean bDownOver = false; /Downing is over /Stop identicalFileAccessI fileAccessI = null; /File Access interfacepublic FileSplitterFetch(String sURL,String sName,long nStart,long nEnd,int id) throws IOExceptionthis.sURL = sURL;this.nStartPos = nStart;this.nEndPos = nEnd;nTh

19、readID = id;fileAccessI = new FileAccessI(sName,nStartPos);while(nStartPos & nEndPos & !URL url = new URL(sURL);String sProperty = bytes=+nStartPos+-,sProperty);Utility.log(sProperty);/logResponseHead(httpConnection); 0 & nStartPos &nStartPos += fileAccessI.write(b,0,nRead);/if(nThreadID = 1)nStartP

20、os = + nStartPos + + nEndPos); + nThreadID + is over!bDownOver = true;/nPos = fileAccessI.write (b,0,nRead);/打印回应的头信息public void logResponseHead(HttpURLConnection con)String header=con.getHeaderFieldKey(i);if(header!/responseHeaders.put(header,httpConnection.getHeaderField(header);Utility.log(header

21、+ :+con.getHeaderField(header);public void splitterStop()*FileAccess.javapublic class FileAccessI implements SerializableRandomAccessFile oSavedFile;long nPos;public FileAccessI() throws IOExceptionthis(,0);public FileAccessI(String sName,long nPos) throws IOExceptionoSavedFile = new RandomAccessFil

22、e(sName,this.nPos = nPos;public synchronized int write(byte b,int nStart,int nLen)int n = -1;oSavedFile.write(b,nStart,nLen);n = nLen;catch(IOException e)e.printStackTrace ();return n;*SiteInfoBean.javapublic class SiteInfoBean private String sSiteURL; /Sites URLprivate String sFilePath; /Saved Files Pathprivate String sFi

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2