자바 http 프로 토 콜 로 파일 다운로드
5283 단어 java 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'라 는 문자열 을 읽 으 면 파일 을 다운로드 하고 싶 은 데 이 서버 는 정지점 전송 을 지원 하지 않 고 단일 스 레 드 로 만 다운로드 할 수 있 습 니 다.
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpDownloadFile {
public static void main(String[] args) {
String sURL = "http://10.21.243.139:8080/gis/file/bou1_4l.shp";
int nStartPos = 0;
int nRead = 0;
String sName = "bou1_4l.shp";
String sPath = "c:\\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;
}
}