자바 http 프로 토 콜 로 파일 다운로드

5283 단어 java http
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'라 는 문자열 을 읽 으 면 파일 을 다운로드 하고 싶 은 데 이 서버 는 정지점 전송 을 지원 하지 않 고 단일 스 레 드 로 만 다운로드 할 수 있 습 니 다.

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;   
 }   
}  

좋은 웹페이지 즐겨찾기