Java實(shí)現(xiàn)基于http協(xié)議的網(wǎng)絡(luò)文件下載
1.HTTP協(xié)議工作方式
基于HTTP協(xié)議的客戶/服務(wù)器模式的信息交換過(guò)程,它分四個(gè)過(guò)程:建立連接、發(fā)送請(qǐng)求信息、獲取服務(wù)器響應(yīng)狀態(tài)、關(guān)閉連接。其中較為復(fù)雜的過(guò)程是:發(fā)送請(qǐng)求信息、獲取服務(wù)器響應(yīng)狀態(tài).
1)向服務(wù)器發(fā)送請(qǐng)求信息
一個(gè)HTTP請(qǐng)求由一個(gè)請(qǐng)求行、可選數(shù)目的請(qǐng)求標(biāo)題、一個(gè)空白行,以及在POST情況下的一些額外的數(shù)據(jù)組成。請(qǐng)求行的格式是:
Method Request-URI HTTP-Vsersion CRLF
Method表示請(qǐng)求方法,如GET和POST
Request-URI標(biāo)識(shí)了要請(qǐng)求的資源,
HTTP-Version表示請(qǐng)求的HTTP協(xié)議版本,
CRLF表示回車換行。
HTTP請(qǐng)求報(bào)文格式如下:
HTTP Command:;;;;//方法字段(GET方法,POST方法)
URI:;;;;;//URL字段,發(fā)送請(qǐng)求至保存該網(wǎng)站的服務(wù)器。
HTTP Version:;;;;//http協(xié)議版本字段
Accept:;;//指示可被接受的請(qǐng)求回應(yīng)的介質(zhì)類型范圍列表。
Accept-Language:;//限制了請(qǐng)求回應(yīng)中首選的語(yǔ)言為簡(jiǎn)體中文,否則使用默認(rèn)值。
Accept-Encoding:;//限制了回應(yīng)中可接受的內(nèi)容編碼值
User-Agent: //定義用戶代理,即發(fā)送請(qǐng)求的瀏覽器類型
Host:;;;;//定義了目標(biāo)所在的主機(jī)
Connection: //告訴服務(wù)器使用連接類型
2)獲取服務(wù)器響應(yīng)狀態(tài)
在發(fā)送HTTP請(qǐng)求行以后,程序就可以讀取服務(wù)器的響應(yīng)狀態(tài)了。HTTP響應(yīng)狀態(tài)行包括:HTTP 狀態(tài)碼和一些HTTP響應(yīng)標(biāo)題。
HTTP回應(yīng)報(bào)文
HTTP Version: HTTP/1.1;;;;//服務(wù)器用的是HTTP/1.1版本
HTTP Status: 200;;//請(qǐng)求成功,信息可以讀取,包含在響應(yīng)的報(bào)文中
Date:;;;;;//響應(yīng)報(bào)文的時(shí)間
Server:;;;//響應(yīng)報(bào)文的服務(wù)器
X-Powered-By:;;;;;//表明運(yùn)行環(huán)境
Set- cookie: //
Vary:;;;;;//
Content-Length:;;//表明實(shí)體的長(zhǎng)度
Connection: //告訴客戶機(jī)在報(bào)文發(fā)送完畢后連接的狀態(tài)
Content-Type:;;;//表明實(shí)體中的對(duì)象類型(html文檔)
Binary Data:;;;//二進(jìn)制數(shù)據(jù)
狀態(tài)碼表示響應(yīng)類型,常用的有:
1××保留
2××表示請(qǐng)求成功地接收
3××為完成請(qǐng)求客戶需進(jìn)一步細(xì)化請(qǐng)求
4××客戶錯(cuò)誤
5××服務(wù)器錯(cuò)誤
在程序中間,如果讀到“HTTP/1.1 200 OK這樣的字符串,表明欲下載文件存在、該服務(wù)器支持?jǐn)帱c(diǎn)續(xù)傳,可以使用多線程下載。如果讀到“HTTP/1.0 200 OK這樣的字符串,表明欲下載文件存在、但該服務(wù)器不支持?jǐn)帱c(diǎn)續(xù)傳,只可以使用單線程下載。
2.實(shí)現(xiàn)代碼
Java代碼
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);
//打開(kāi)連接
HttpURLConnection httpConnection = (HttpURLConnection) url
.openConnection();
//獲得文件長(zhǎng)度
long nEndPos =getFileSize(sURL);
RandomAccessFile oSavedFile= new RandomAccessFile(sPath+""+sName, "rw");
httpConnection.setRequestProperty("User-Agent", "Internet Explorer");
String sProperty = "bytes=" + nStartPos + "-";
//告訴服務(wù)器book.rar這個(gè)文件從nStartPos字節(jié)開(kāi)始傳
httpConnection.setRequestProperty("RANGE", sProperty);
System.out.println(sProperty);
InputStream input = httpConnection.getInputStream();
byte[] b = new byte[1024];
//讀取網(wǎng)絡(luò)文件,寫入指定的文件中
while ((nRead = input.read(b, 0, 1024)) > 0
&& nStartPos < nEndPos ) {
oSavedFile.write(b, 0, nRead);
nStartPos += nRead;
}
httpConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
//; 獲得文件長(zhǎng)度
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 = 1i++) {
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;
}
}
相關(guān)文章:
1. Java下Struts框架中的ActionForm類詳解2. Java JDK動(dòng)態(tài)代理(AOP)用法及實(shí)現(xiàn)原理詳解3. JAVA中Session的會(huì)話狀態(tài)4. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)5. java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實(shí)例代碼詳解)6. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)財(cái)務(wù)記賬管理系統(tǒng)7. java 實(shí)現(xiàn)數(shù)組擴(kuò)容與縮容案例8. java使用ffmpeg實(shí)現(xiàn)上傳視頻的轉(zhuǎn)碼提取視頻的截圖等功能(代碼操作)9. JavaWeb Servlet中url-pattern的使用10. 解決ASP中http狀態(tài)跳轉(zhuǎn)返回錯(cuò)誤頁(yè)的問(wèn)題
