快速业务通道

Java网络编程从入门到精通(24):实现HTTP断点续传下载工具 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
数为5000-1000+1=4001。

6.开始下载文件,并计算下载进度(百分比形式)。如果网络连接断开时,文件仍未下载完,重新执行第一步。也果文件已经下载完,退出程序。

分析以上六个步骤得知,有四个主要的功能需要实现:

1.生成HTTP请求消息,并将其发送到服务器。这个功能由generateHttpRequest方法来完成。

2.分析HTTP响应消息头。这个功能由analyzeHttpHeader方法来完成。

3.得到下载文件的实际大小。这个功能由getFileSize方法来完成。

4.下载文件。这个功能由download方法来完成。

以上四个方法均被包含在这个断点续传工具的核心类HttpDownload.java中。在给出HttpDownload类的实现之前先给出一个接口DownloadEvent接口,从这个接口的名字就可以看出,它是用来处理下载过程中的事件的。下面是这个接口的实现代码:

package download;    public interface DownloadEvent    {        void percent(long n); // 下载进度        void state(String s); // 连接过程中的状态切换        void viewHttpHeaders(String s); // 枚举每一个响应消息字段    }

Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(3)

时间:2011-01-12

从上面的代码可以看出,DownloadEvent接口中有三个事件方法。在以后的主函数中将实现这个接口,来向控制台输出相应的信息。下面给出了HttpDownload类的主体框架代码:

001  package download; 002 003  import java.net.*; 004  import java.io.*; 005  import java.util .*; 006 007  public class HttpDownload 008  { 009      private HashMap httpHeaders = new HashMap(); 010      private String stateCode; 011 012      // generateHttpRequest方法 013 014      /*  ananlyzeHttpHeader方法 015       * 016       *  addHeaderToMap方法 017       * 018       *  analyzeFirstLine方法 019       */      020 021      // getFileSize方法 022 023      // download方法 024 025      /*  getHeader方法 026       * 027       *  getIntHeader方法 028       */ 029  }

上面的代码只是HttpDownload类的框架代码,其中的方法并未直正实现。我们可以从中看出第012、014、021和023行就是上述的四个主要的方法。在016和018行的addHeaderToMap和analyzeFirstLine方法将在analyzeHttpHeader方法中用到。而025和027行的getHeader和getIntHeader方法在getFileSize和download方法都会用到。上述的八个方法的实现都会在后面给出。

001  private void generateHttpRequest(OutputStream out, String host,
002          String path, long startPos) throws IOException
003  {
004      OutputStreamWriter writer = new OutputStreamWriter(out);
005      writer.write("GET " + path + " HTTP/1.1\r\n");
006      writer.write("Host: " + host + "\r\n");
007      writer.write("Accept: */*\r\n");
008      writer.write("User-Agent: My First Http Download\r\n");
009      if (startPos > 0) // 如果是断点续传,加入Range字段
010          writer.write("Range: bytes=" + String.valueOf(startPos) + "-\r\n");
011      writer.write("Connection: close\r\n\r\n");
012      writer.flush();
013  }

这个方法有四个参数:

1.OutputStream out

使用Socket对

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号