国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

“網絡螞蟻”的Java實現

2019-11-18 10:46:00
字體:
來源:轉載
供稿:網友

   “網絡螞蟻”、Falshget 等許多多線程下載軟件都是網友的必備工具,利用這些工具可以快速從服務器上下載比較大的文件,這些工具的工作特性是把服務器端的文件分成幾個段,每個段分別、同時進行下載。編寫這類程序,第一、必須對HTTP協議有較為充分的了解;第二、有效使用多線程編程手段在軟件上實現。
  
  HTTP 協議的簡介
  HTTP協議是一種超文本傳輸協議(Hypertext Transfer PRotocol),工作于網絡應用層,自1990年起廣泛應用于WWW 的全球信息服務,HTTP協議的具體說明可以在網上查閱RFC2518、RFC2616等文檔。
  
  HTTP 協議老的標準是HTTP/1.0,目前最通用的標準是HTTP/1.1。HTTP/1.1是在HTTP/1.0基礎上的升級,增加了一些功能,全面兼容HTTP/1.0。HTTP/1.0不支持文件斷點續傳,假如服務器使用HTTP/1.0,“網絡螞蟻”的任何多線程下載程序都只能按單線程下載;好在目前的Web服務器絕大多數都采用了HTTP/1.1,所以,下面將基于HTTP/1.1進行介紹。
  
  HTTP協議的相關重要命令
  基于HTTP的瀏覽器瀏覽網頁、下載文件時,工作原理類似客戶機/服務器模式:瀏覽器向Web服務器發出一個HTTP請求行;Web服務器在收到有效的請求后,返回一個狀態行或多個響應標題、一個空白行和相關文檔。根據這一工作原理,下載程序必須實現向服務器發送請求和獲取服務器響應狀態的功能。
  
  1.向服務器發送 GET請求命令
  
  一個HTTP請求由一個請求行、可選數目的請求標題、一個空白行,以及在POST情況下的一些額外的數據組成。請求行的格式是:
  
  請求方法 URI  HTTP/版本號
  
  GET 命令是瀏覽器常用的文檔請求方法,在程序中間使用
  
  GET URI  HTTP/1.1
  
  向Web服務器發送請求行(行號3),java 代碼如下:
  
  ....
  
  clientSocket = new Socket(host, port);//打開要下載文件服務器的Socket
  
  outStream = new PrintStream(clientSocket.getOutputStream());
  
  ....
  
  outStream.println(“GET”+uri+“ HTTP/1.1”);
  
  outStream.println(“Host:”+host);
  
  outStream.println(“Accept:*/* ”);
  
  outStream.println(“Referer:”);
  
  outStream.println();
  
  ....
  
  注:第4行給出URL中的主機名和端口號,
  
  第5行說明客戶端接收所有MIME類型,
  
  第7行方送一個空白行,表明請求行結束。
  
  2.獲取服務器響應狀態
  
  在發送HTTP請求行以后,程序就可以讀取服務器的響應狀態了。HTTP響應狀態行包括:HTTP 狀態碼和一些HTTP響應標題。
  
  1) HTTP狀態碼
  
  HTTP狀態碼格式是 HTTP/版本信息的數字表示。狀態碼例子如下:
  
  HTTP/1.0 200 OK // 表示服務器支持HTTP/1.0 協議,成功
  
  HTTP/1.1 200 OK // 表示服務器支持HTTP/1.1 協議,成功
  
  HTTP/1.0 404 Not Found // 表示服務器支持HTTP/1.0 協議,訪問文件沒有找到
  
  在程序中間,假如讀到“HTTP/1.1 200 OK”這樣的字符串,表明欲下載文件存在、該服務器支持斷點續傳,可以使用多線程下載。假如讀到“HTTP/1.0 200 OK”這樣的字符串,表明欲下載文件存在、但該服務器不支持斷點續傳,只可以使用單線程下載。
  
  .....
  
  while ((line=inStream.readLine()) != null) //將服務器響應狀態讀到line
  
  ........
  
  if(line.substring(0,7).equals(“HTTP/1.”) ) //判定是否支持HTTP/1.1
  
  { if(line.charAt(7)==‘0’)
  
  {
  
  System.out.println(“server use http/1.0”);
  
  threadcount=1;
  
  }
  
  if(!(line.substring(9,12)).equals(“200”)) //判定請求是否成功
  
  { System.out.println(“ERROR:”+line);
  
  return false;
  
  }
  
  }
  
  2) 讀取重要的響應標題,獲得要下載文檔的文件長度
  
  假如HTTP狀態碼表明訪問成功,服務器會回送一些標題行,我們最關注的是Content-Length 這一行,比如,假如服務器回送“Content-Length:1000”,表明請求文件的長度是1000字節,所以讀取這一行信息,可以得到文件的長度信息:
  
  ....
  
  if(line.substring(0,15).equals(“Content-Length:”) )
  
  { filelength=Long.parseLong(line.substring(15).trim());
  
  System.out.println(“file length:” +filelength);
  
  }
  
  ......
  
  向服務器發送斷點續傳請求
  
  如上所述,假如服務器支持HTTP/1.1,再次向服務器發送GET請求:
  
  .....
  
  outStream.println(“GET ”+uri+“HTTP/1.1 ”);
  
  outStream.println(“Host:”+host);
  
  outStream.println(“Accept:*/* ”);
  
  outStream.println(“RANGE:bytes=”+(fileblocklength)*thisthreadid+“-”);
  
  outStream.println();
  
  .....
  
  第4行是要害,“RANGE:bytes=”是HTTP/1.1新增內容,HTTP/1.0每次傳送文件都是從文件頭開始,即0字節處開始,“RANGE:bytes=XXXX”表示要求服務器從文件XXXX字節處開始傳送,這就是我們平時所說的斷點續傳!
  
  分割文件,多線程下載
  
  使用多線程編程技術,同時啟動多個線程,根據線程個數,計算文件分割位置,向服務器發送幾個不同的下載斷點,同時接受數據并寫入文件,就可以實現多線程下載了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扬中市| 昌邑市| 大港区| 富蕴县| 鸡东县| 招远市| 读书| 雷山县| 嵊泗县| 黄大仙区| 龙里县| 灵武市| 铜陵市| 随州市| 驻马店市| 濮阳市| 民县| 卫辉市| 象山县| 乌拉特后旗| 大同市| 景洪市| 青田县| 红桥区| 华安县| 新建县| 眉山市| 河源市| 木里| 高州市| 皮山县| 兴文县| 西充县| 奉化市| 手机| 东宁县| 屯昌县| 南和县| 宁国市| 兴化市| 闻喜县|