달력

3

« 2020/3 »

  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  

 

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의 값을 반환합니다.

 


Posted by codedragon codedragon

댓글을 달아 주세요