CODEDRAGON ㆍDevelopment/Java
URLConnection 클래스 사용 절차
URLConnection 클래스를 사용하는 프로그램은 아래와 같은 기본적인 절차를 따르게 됩니다.
항상 이 모든 절차를 수행해야 하는 것은 아니며, URLConnection의 기본 설정으로 해당 URL을 처리할 수 있다면 3번째 단계인 반환된 "URLConnection객체 설정"단계는 생략해도 됩니다.
단계 |
수행 내용 |
1 |
URL객체 생성 |
2 |
생성된 URL에 대한 URLConnection객체를 얻기위해 URL객체의 openConnection()메소드 호출 |
3 |
반환된 URLConnection객체 설정 |
4 |
헤더 필드 읽기 |
5 |
입력 스트림을 구하고, 데이터 읽기 |
6 |
출력 스트림을 구하고, 데이터 쓰기 |
7 |
연결 종료 |
1,2,3단계: URLConnection 클래스를 사용하여 URL로 부터 데이터 읽기
URL객체를 생성한 후 생성된 URL에 대한 URLConnection객체를 얻기 위해 URL객체의 openConnection()메소드를 호출합니다.
반환된 URLConnection객체(uc )의 getInputStream()메서드를 호출한 후 일반적인 스트림 API를 사용하여 입력 스트림에서 데이터를 읽어옵니다.
try{
//URL객체를 생성
URL u = new URL(args[0]);
//생성된 URL에 대한 URLConnection객체를 얻기 위해 URL객체의 openConnection()메소드를 호출합니다.
URLConnection uc = u.openConnection();
//반환된 URLConnection객체(uc )의 getInputStream()메서드를 호출한 후
//일반적인 스트림 API를 사용하여 입력 스트림에서 데이터를 읽어옵니다.
InputStream raw = uc.getInputStream();
InputStream buffer = new BufferedInputStream(raw);
Reader reader = new InputStreamReader(buffer);
int c;
while((c = reader.read()) != -1) {
System.out.println((char)c);
}
} |
4단계: 헤더 읽기
HTTP서버는 요청에 대한 각 응답에 앞서 많은 정보를 헤더를 통해 제공합니다.
아래는 아파치 웹 서버가 반환하는 일반적인 HTTP헤더의 내용입니다.
HTTP/1.1 301 Moved Permanently Date: Mon, 18 Jun 2015 12:23:35 GMT Server: Apache Location: http://www.test.com/ Content-Length: 296 Connection: close Content-Type: text/html; charset=iso-8859-1 Expires : Sat, 07 Dec 2015 12:1:41 GMT Last-Modified : Sun, 17 Jun 2015 14:05:01 GMT
|
HTTP헤더에는 요청된 문서에 대해 아래와 같은 정보가 포함되어 있습니다. 그러나 이 정보는 서버에 따라 조금씩 차이가 있을 수 있습니다.
HTTP/1.1 301 Moved Permanently |
HTTP버전 |
Date: Mon, 18 Jun 2015 12:23:35 GMT |
현재 날짜와 시간 |
Server: Apache |
아파치 웹 서버 |
Location: http://www.test.com/ |
위치 |
Content-Length: 296 |
바이트 단위의 문서 크기 |
Connection: close |
연결상태 |
Content-Type: text/html; |
컨텐츠 타입 |
charset=iso-8859-1 |
컨텐츠를 인코딩하는데 사용한 문자 집합 |
Expires : Sat, 07 Dec 2015 12:1:41 GMT |
컨텐츠의 만료일 |
Last-Modified : Sun, 17 Jun 2015 14:05:01 GMT |
컨텐츠가 마지막으로 수정된 날짜 |
특정 헤더 필드 가져오기
특히 많이 사용되는 필드에 대한 6개의 메소드입니다.
Content-Type
응답 본문의 MIME 미디어 타입을 반환하는 메소드입니다.
이 메소드의 동작여부는 웹 서버가 올바른 컨텐츠 타입을 보내는 가에 달려있습니다.
이 메소드는 예외를 발생시키지 않으며 컨텐츠 타입에 대한 정보가 없는 경우 null을 반환합니다.
public String getContent() |
Content-type: text/html; character=utf8 |
Content-Length
콘텐츠의 길이를 반환하는 메소드입니다.
Content-Length 헤더가 없는 경우 getContentLength() 메소드는 -1을 반환하며, 예외를 발생시키지 않습니다.
읽어야 할 데이터의 크기를 정확히 알아야 할 때, 또는 데이터를 저장해 둘 충분한 크기의 버퍼를 미리 만들어야 할 경우 사용합니다.
public int getContentLength() |
public long getContentLengthLong() |
Content-Encoding
콘텐츠의 인코딩 방식을 알려 주는 스트링 타입을 반환하는 메소드입니다.
인코딩되지 않은 채로 컨텐츠가 전송될 경우, 이 메소드는 null을 반환하며 예외를 발생시키지 않습니다.
public String getContentEncoding() |
Date
언제 문서가 전송되었는지를 나타내는 long 타입을 반환하는 메소드입니다.
이 값은 그리니치 표준시, 1970년 1월 1일 이후로 문서가 전송된 시간까지를 밀리초로 나타낸 값입니다.
public long getDate() |
Date documentSent = new Date(uc.getDate()); |
Last-Modified
문서가 마지막으로 변경된 날짜를 반환하는 메소드입니다.
HTTP헤더에 Last-Modified필드가 없는 경우 이 메소드는 0을 반환합니다.
public long getLastModified() |
Expires
서버 기준의 만료일을 반환하는 메소드입니다.
만료일은 언제 해당 문서를 캐시에서 지우고 다시 서버에서 읽어야 하는 지를 나타냅니다.
이 값은 Date필드와 같이 1970년 1월 1일 이후의 밀리초를 나타냅니다.
public long getExpiration() |
임의의 헤더 필드 가져오기
앞에서 본 6개의 메소드는 헤더로 부터 특정 필드의 값을 요청하지만, 이론적으로 하나의 메시지에 포함될 수 있는 헤더의 필드 수는 제한이 없습니다. 그렇기 때문에 임의의 헤더 필드로 부터 값을 가져올 방법이 필요한데, 아래의 메소드를 통해 헤더에 있는 임의의 필드로부터 값을 가져올 수 있습니다.
public String getHeaderField(String name) |
이름이 있는 헤더 필드의 값을 반환하는 메소드입니다.
헤더의 이름은 대소문자를 가리지 않으며 종료 콜론을 포함하지 않습니다.
public String getHeaderFieldKey(int n) |
String header6 = uc.getHeaderFieldKey(6); |
n 번째 헤더 필드의 키 값을 반환 하는 메소드입니다.
0번째 헤더 필드에는 null키를 가진 요청 메소드가 있기 때문에, 첫번째 헤더는 1부터 시작합니다. 헤더에서 6번째 키를 가져오기 위해서는 위의 예제 코드 처럼 작성하면 됩니다.
public String getHeaderField(int n) |
n 번째 헤더 필드를 반환하는 메소드입니다.
HTTP에서 요청메소드와 경로를 포함하고 있는 시작 라인이 헤더 필드 0이며 첫번째 헤더는 1번에 위치합니다.
public long getHeaderFieldDate(String name, long default) |
먼저 name 인자로 전달된 헤더 필드를 가져온 뒤 해당 필드의 값을 String에서 long 으로 변환하는 메소드입니다.
이 때 long값은 1970년 1월 1일 자정 이후의 밀리초를 나타내며, getHeaderFieldDate()메소드는 날짜를 나타내는 헤더 필드를 가져올때 사용합니다.
public int getHeaderFieldInt(String name, int default) |
int contentLength = uc.getHeaderFieldInt("content-length",-1); |
name 인자로 전달된 헤더 필드의 값을 가져와서 int로 변환하는 메소드입니다.
이 메서드는 Content-Length필드의 값을 가져오는데 사용합니다.
위의 예제는 URLConnection객체에서 컨텐츠 길이를 가져오는 프로그램의 코드입니다. 이 때 Content-Length필드가 없는 경우에는 -1의 값을 반환합니다.
'Development > Java' 카테고리의 다른 글
WEKA Applications (0) | 2019.12.04 |
---|---|
담당자별 머신러닝 수행 역할 w/ Weka (0) | 2019.12.04 |
Jayes(제이즈) (0) | 2019.12.04 |
Netica(네티카) (0) | 2019.12.03 |
Weka Wiki (0) | 2019.12.01 |