“網路螞蟻”、Falshget 等許多多線程下載軟體都是網友的必備工具,利用這些工具可以快速從伺服器上下載比較大的檔案,這些工具的工作特性是把伺服器端的檔案分成幾個段,每個段分別、同時進行下載。編寫這類程式,第一、必須對HTTP協議有較為充分的瞭解;第二、有效使用多線程編程手段在軟體上實現。
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行方送一個空白行,表明請求行結束。