熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java實現基於http協議的網絡文件下載

2022-06-13   來源: Java核心技術 

  HTTP協議工作方式

  基於HTTP協議的客戶/服務器模式的信息交換過程它分四個過程建立連接發送請求信息獲取服務器響應狀態關閉連接其中較為復雜的過程是:發送請求信息獲取服務器響應狀態

  )向服務器發送請求信息

  一個HTTP請求由一個請求行可選數目的請求標題一個空白行以及在POST情況下的一些額外的數據組成請求行的格式是

  Method RequestURI HTTPVsersion CRLF

  Method表示請求方法如GET和POST

  RequestURI標識了要請求的資源

  HTTPVersion表示請求的HTTP協議版本

  CRLF表示回車換行

  HTTP請求報文格式如下:

  HTTP Command:       //方法字段(GET方法POST方法)

  URI:                //URL字段發送請求至保存該網站的服務器

  HTTP Version:       //http協議版本字段

  Accept:             //指示可被接受的請求回應的介質類型范圍列表

  AcceptLanguage:    //限制了請求回應中首選的語言為簡體中文否則使用默認值

  AcceptEncoding:    //限制了回應中可接受的內容編碼值

  UserAgent:         //定義用戶代理即發送請求的浏覽器類型

  Host:               //定義了目標所在的主機

  Connection:         //告訴服務器使用連接類型

  )獲取服務器響應狀態

  在發送HTTP請求行以後程序就可以讀取服務器的響應狀態了HTTP響應狀態行包括HTTP 狀態碼和一些HTTP響應標題

  HTTP回應報文

  HTTP Version: HTTP/       //服務器用的是HTTP/版本

  HTTP Status:              //請求成功信息可以讀取包含在響應的報文中

  Date:                        //響應報文的時間

  Server:                      //響應報文的服務器

  XPoweredBy:                //表明運行環境

  Set cookie:                 //

  Vary:                        //

  ContentLength:             //表明實體的長度

  Connection:                 //告訴客戶機在報文發送完畢後連接的狀態

  ContentType:              //表明實體中的對象類型(html文檔)

  Binary Data:              //二進制數據

  狀態碼表示響應類型常用的有

  ××  保留

  ××  表示請求成功地接收

  ××  為完成請求客戶需進一步細化請求

  ××  客戶錯誤

  ××  服務器錯誤

  在程序中間如果讀到HTTP/ OK這樣的字符串表明欲下載文件存在該服務器支持斷點續傳可以使用多線程下載如果讀到HTTP/ OK這樣的字符串表明欲下載文件存在但該服務器不支持斷點續傳只可以使用單線程下載

  實現代碼

  Java代碼

  import javaioIOException;

  import javaioInputStream;

  import javaioRandomAccessFile;

  import HttpURLConnection;

  import URL;

  public class TestDownFile {

  public static void main(String[] args){

  String sURL =;

  int nStartPos=;

  int nRead=;

  String sName=bookrar;

  String sPath=e:\\temp;

  try {

  URL url = new URL(sURL);

  //打開連接

  HttpURLConnection httpConnection = (HttpURLConnection) url

  openConnection();

  //獲得文件長度

  long nEndPos =getFileSize(sURL);

  RandomAccessFile oSavedFile= new RandomAccessFile(sPath+\\+sName rw);

  (UserAgent Internet Explorer);

  String sProperty = bytes= + nStartPos + ;

  //告訴服務器bookrar這個文件從nStartPos字節開始傳

  (RANGE sProperty);

  Systemoutprintln(sProperty);

  InputStream input = ();

  byte[] b = new byte[];

  //讀取網絡文件寫入指定的文件中

  while ((nRead = inputread(b )) >

  && nStartPos < nEndPos ) {

  oSavedFilewrite(b nRead);

  nStartPos += nRead;

  }

  ();

  } catch (Exception e) {

  eprintStackTrace();

  }

  }

  //  獲得文件長度

  public static long getFileSize(String sURL) {

  int nFileLength = ;

  try {

  URL url = new URL(sURL);

  HttpURLConnection httpConnection = (HttpURLConnection) url

  openConnection();

  (UserAgent Internet Explorer);

  int responseCode = ();

  if (responseCode >= ) {

  Systemerrprintln(Error Code : + responseCode);

  return ; // represent access is error

  }

  String sHeader;

  for (int i = ;; i++) {

  sHeader = (i);

  if (sHeader != null) {

  if (sHeaderequals(ContentLength)) {

  nFileLength = IntegerparseInt(httpConnection

  getHeaderField(sHeader));

  break;

  }

  } else

  break;

  }

  } catch (IOException e) {

  eprintStackTrace();

  } catch (Exception e) {

  eprintStackTrace();

  }

  Systemoutprintln(nFileLength);

  return nFileLength;

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26034.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.