断点续传的原理

  (一)断点续传的原理

  其实断点续传的原理很简单,就是在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了。

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

  //启动子线程

  fileSplitterFetch = new FileSplitterFetch[nStartPos.length];

  for(int i=0;i<nStartPos.length;i++)

  {

  fileSplitterFetch[i] = new FileSplitterFetch(siteInfoBean.getSSiteURL(),

  siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),

  nStartPos[i],nEndPos[i],i);

  Utility.log("Thread " + i + " , nStartPos = " + nStartPos[i] + ", nEndPos = " + nEndPos[i]);

  fileSplitterFetch[i].start();

  }

  // fileSplitterFetch[nPos.length-1] = new FileSplitterFetch(siteInfoBean.getSSiteURL(),

  siteInfoBean.getSFilePath() + File.separator + siteInfoBean.getSFileName(),nPos[nPos.length-1],nFileLength,nPos.length-1);

  // Utility.log("Thread " + (nPos.length-1) + " , nStartPos = " + nPos[nPos.length-1] + ",

  nEndPos = " + nFileLength);

  // fileSplitterFetch[nPos.length-1].start();

  //等待子线程结束

  //int count = 0;

  //是否结束while循环

  boolean breakWhile = false;

  while(!bStop)

  {

  write_nPos();

  Utility.sleep(500);

  breakWhile = true;

  for(int i=0;i<nStartPos.length;i++)

  {

  if(!fileSplitterFetch[i].bDownOver)

  {

  breakWhile = false;

  break;

  }

  }

  if(breakWhile)

  break;

  //count++;

  //if(count>4)

  // siteStop();

  }

  System.err.println("文件下载结束!");

  }

  catch(Exception e){e.printStackTrace ();}

  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值