用java實現基於http協議的網路檔案下載
基於HTTP的協議的網路檔案下載,工作原理建立在請求/響應模式(Request/Response)上:一個客戶端與伺服器建立連線後,客戶端向Web伺服器發出一個HTTP請求行;Web伺服器在收到有效的請求後,返回一個狀態行或多個響應標題、一個空白行和相關文件。HTTP協議使用的埠號,通常為80。開發基於http協議的網路檔案下載必須掌握HTTP協議,包括向伺服器傳送請求和獲取伺服器響應狀態的過程。HTTP1.0協議不支援斷點續傳功能. 本文用java提供了一個簡單的實現.
1.HTTP協議工作方式
基於HTTP協議的客戶/伺服器模式的資訊交換過程,它分四個過程:建立連線、傳送請求資訊、獲取伺服器響應狀態、關閉連線。其中較為複雜的過程是:傳送請求資訊、獲取伺服器響應狀態.
1)向伺服器傳送請求資訊
一個HTTP請求由一個請求行、可選數目的請求標題、一個空白行,以及在POST情況下的一些額外的資料組成。請求行的格式是:
Method Request-URI HTTP-Vsersion CRLF
Method表示請求方法,如GET和POST
Request-URI標識了要請求的資源,
HTTP-Version表示請求的HTTP協議版本,
CRLF表示回車換行。
HTTP請求報文格式如下:
HTTP Command: //方法欄位(GET方法,POST方法)
URI: //URL欄位,傳送請求至儲存該網站的伺服器。
HTTP Version: //http協議版本欄位
Accept: //指示可被接受的請求迴應的介質型別範圍列表。
Accept-Language: //限制了請求迴應中首選的語言為簡體中文,否則使用預設值。
Accept-Encoding: //限制了迴應中可接受的內容編碼值
User-Agent: //定義使用者代理,即傳送請求的瀏覽器型別
Host: //定義了目標所在的主機
Connection: //告訴伺服器使用連線型別
2)獲取伺服器響應狀態
在傳送HTTP請求行以後,程式就可以讀取伺服器的響應狀態了。HTTP響應狀態行包括:HTTP 狀態碼和一些HTTP響應標題。
HTTP迴應報文
HTTP Version: HTTP/1.1 //伺服器用的是HTTP/1.1版本
HTTP Status: 200 //請求成功,資訊可以讀取,包含在響應的報文中
Date: //響應報文的時間
Server: //響應報文的伺服器
X-Powered-By: //表明執行環境
Set- cookie: //
Vary: //
Content-Length: //表明實體的長度
Connection: //告訴客戶機在報文傳送完畢後連線的狀態
Content-Type: //表明實體中的物件型別(html文件)
Binary Data: //二進位制資料
狀態碼錶示響應型別,常用的有:
1×× 保留
2×× 表示請求成功地接收
3×× 為完成請求客戶需進一步細化請求
4×× 客戶錯誤
5×× 伺服器錯誤
在程式中間,如果讀到“HTTP/1.1 200 OK”這樣的字串,表明欲下載檔案存在、該伺服器支援斷點續傳,可以使用多執行緒下載。如果讀到“HTTP/1.0 200 OK”這樣的字串,表明欲下載檔案存在、但該伺服器不支援斷點續傳,只可以使用單執行緒下載。
2.實現程式碼
1.HTTP協議工作方式
基於HTTP協議的客戶/伺服器模式的資訊交換過程,它分四個過程:建立連線、傳送請求資訊、獲取伺服器響應狀態、關閉連線。其中較為複雜的過程是:傳送請求資訊、獲取伺服器響應狀態.
1)向伺服器傳送請求資訊
一個HTTP請求由一個請求行、可選數目的請求標題、一個空白行,以及在POST情況下的一些額外的資料組成。請求行的格式是:
Method Request-URI HTTP-Vsersion CRLF
Method表示請求方法,如GET和POST
Request-URI標識了要請求的資源,
HTTP-Version表示請求的HTTP協議版本,
CRLF表示回車換行。
HTTP請求報文格式如下:
HTTP Command: //方法欄位(GET方法,POST方法)
URI: //URL欄位,傳送請求至儲存該網站的伺服器。
HTTP Version: //http協議版本欄位
Accept: //指示可被接受的請求迴應的介質型別範圍列表。
Accept-Language: //限制了請求迴應中首選的語言為簡體中文,否則使用預設值。
Accept-Encoding: //限制了迴應中可接受的內容編碼值
User-Agent: //定義使用者代理,即傳送請求的瀏覽器型別
Host: //定義了目標所在的主機
Connection: //告訴伺服器使用連線型別
2)獲取伺服器響應狀態
在傳送HTTP請求行以後,程式就可以讀取伺服器的響應狀態了。HTTP響應狀態行包括:HTTP 狀態碼和一些HTTP響應標題。
HTTP迴應報文
HTTP Version: HTTP/1.1 //伺服器用的是HTTP/1.1版本
HTTP Status: 200 //請求成功,資訊可以讀取,包含在響應的報文中
Date: //響應報文的時間
Server: //響應報文的伺服器
X-Powered-By: //表明執行環境
Set- cookie: //
Vary: //
Content-Length: //表明實體的長度
Connection: //告訴客戶機在報文傳送完畢後連線的狀態
Content-Type: //表明實體中的物件型別(html文件)
Binary Data: //二進位制資料
狀態碼錶示響應型別,常用的有:
1×× 保留
2×× 表示請求成功地接收
3×× 為完成請求客戶需進一步細化請求
4×× 客戶錯誤
5×× 伺服器錯誤
在程式中間,如果讀到“HTTP/1.1 200 OK”這樣的字串,表明欲下載檔案存在、該伺服器支援斷點續傳,可以使用多執行緒下載。如果讀到“HTTP/1.0 200 OK”這樣的字串,表明欲下載檔案存在、但該伺服器不支援斷點續傳,只可以使用單執行緒下載。
2.實現程式碼
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class TestDownFile {
public static void main(String[] args){
String sURL ="http://localhost:8080/hrproject/book.rar";
int nStartPos=0;
int nRead=0;
String sName="book.rar";
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");
httpConnection.setRequestProperty("User-Agent", "Internet Explorer");
String sProperty = "bytes=" + nStartPos + "-";
//告訴伺服器book.rar這個檔案從nStartPos位元組開始傳
httpConnection.setRequestProperty("RANGE", sProperty);
System.out.println(sProperty);
InputStream input = httpConnection.getInputStream();
byte[] b = new byte[1024];
//讀取網路檔案,寫入指定的檔案中
while ((nRead = input.read(b, 0, 1024)) > 0
&& nStartPos < nEndPos ) {
oSavedFile.write(b, 0, nRead);
nStartPos += nRead;
}
httpConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
// 獲得檔案長度
public static long getFileSize(String sURL) {
int nFileLength = -1;
try {
URL url = new URL(sURL);
HttpURLConnection httpConnection = (HttpURLConnection) url
.openConnection();
httpConnection.setRequestProperty("User-Agent", "Internet Explorer");
int responseCode = httpConnection.getResponseCode();
if (responseCode >= 400) {
System.err.println("Error Code : " + responseCode);
return -2; // -2 represent access is error
}
String sHeader;
for (int i = 1;; i++) {
sHeader = httpConnection.getHeaderFieldKey(i);
if (sHeader != null) {
if (sHeader.equals("Content-Length")) {
nFileLength = Integer.parseInt(httpConnection
.getHeaderField(sHeader));
break;
}
} else
break;
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(nFileLength);
return nFileLength;
}
}
相關文章
- 實現一個基於FTP協議的程式——檔案上傳下載器(十三)FTP協議
- 利用HTTP協議實現檔案下載的多執行緒斷點續傳HTTP協議執行緒斷點
- Java下載遠端伺服器檔案到本地(http協議和ssh2協議)Java伺服器HTTP協議
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- 基於HTTP的功能追加協議HTTP協議
- Python 基於 TCP 傳輸協議的網路通訊實現PythonTCP協議
- 關於JAVA 2 網路協議ftp,tfpt,telnet,dns的實現Java協議FTPDNS
- Java實現檔案下載功能Java
- okhttp 原始碼解析 - 網路協議的實現 - HTTP 之 cookie 管理HTTP原始碼協議Cookie
- 實現網站由http協議轉為https協議網站HTTP協議
- 網路通訊協議-HTTP協議詳解!協議HTTP
- 用於網路協議測試的工具協議
- java實現檔案的下載的方法概述Java
- Java程式碼實現下載檔案Java
- Http網路協議包 (快速理解)HTTP協議
- java實現sftp檔案的上傳下載JavaFTP
- atitit.網路檔案訪問協議.unc smb nfs ftp http的區別協議NFSFTPHTTP
- STOMP協議——基於Websocket實現協議Web
- 網路協議之:基於UDP的高速資料傳輸協議UDT協議UDP
- 網路安全網路協議知識點中,http協議是什麼?協議HTTP
- 用C++實現下載檔案的功能C++
- 如何實現java檔案佇列下載Java佇列
- 基於QUIC協議的HTTP/3正式釋出!UI協議HTTP
- HTTP協議基礎HTTP協議
- 低功耗4G模組HTTP網路協議應用HTTP協議
- 最全網路協議(轉載)協議
- Java基礎 UDP協議下,收發資料的程式碼實現JavaUDP協議
- [原始碼和文件分享]基於WinInet的FTP檔案下載實現原始碼FTP
- SpringMVC下http和https路徑下的檔案下載SpringMVCHTTP
- Weex 實現檔案的下載
- 網路協議 - TCP/IP、HTTP、HTTPS、HTTP2.0協議TCPHTTP
- 基於byte[]的HTTP協議頭分析程式碼HTTP協議
- 基於Http協議的軟體自動升級HTTP協議
- 如何在 Apinto 實現 HTTP 與gRPC 的協議轉換 (下)APIHTTPRPC協議
- (iOS)如何處理不受信任的http網路憑證 (WebView,下載檔案)iOSHTTPWebView
- javaweb基礎--HTTP協議JavaWebHTTP協議
- 計算機網路之十二:HTTP協議計算機網路HTTP協議
- Android使用http協議訪問網路AndroidHTTP協議