openConnection()은 네트워크 커넥션을 만들어주지 않는다!


openConnection()메서드는 메서드 이름만을 봤을때, 네트워크 접속을 가능하게 해주는 메서드처럼 보인다. 하지만 이 메서드는 실제 네트워크 커넥션을 만들어주는 메서드가 아니다.

단지, http URL connection 인스턴스(URLConnection)를 만들어 리턴시켜주는 역할만을 한다.



openConnection()메서드는네트워크 접속과 관련된 매개변수, 속성 등(url, 요청메서드 등)을 조작하게 해주고, 실제 접속은 connect()메서드가 실행되는 시점에서 이뤄지게된다.


/** * This method returns the entire result from the HTTP response.
 *
 * @param url The URL to fetch the HTTP response from.
 * @return The contents of the HTTP response.
 * @throws IOException Related to network and stream reading 
*/

public static String getResponseFromHttpUrl(URL url) throws IOException {
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    try {
        InputStream in = urlConnection.getInputStream();

        Scanner scanner = new Scanner(in);
        scanner.useDelimiter("\\A");

        boolean hasInput = scanner.hasNext();
        if (hasInput) {
            return scanner.next();
        } else {
            return null;
        }
    } finally {
        urlConnection.disconnect();
    }

상단코드에서 볼수있듯이 openconnection()을 실행시키고, getInputStream()을 통해 인풋스트림을 얻는다. 이 인풋스트림을 가지고 오픈커낵션의 내용을 읽게된다.

내용을 읽는데는 여러가지 방법이 있는데, 상단의 코드는 Scanner를 사용하였다. 스캐너는 스트림을 토크나이즈 하는데 사용된다. 깃헙의 관련 페이지에 따르면, 퍼포먼스 테스트결과 Scanner는 상대적으로 빠른 속도를 보장한다.

스캐너의 구분자로 \A가 사용된것이 눈에띌것이다.  \A는문자열의  시작점과 일치시켜주는 정규식 표현인데,  이를 스캐너의 구분자로 사용하게되면 스캐너는 스트림의 컨텐츠들을 통째로 하나의 스트링으로 변환시켜 다음 토큰 스트림으로 반환시킨다.

    예)
    InputStream source = new URL("http://www.oreilly.com/").openStream();
    String text = new Scanner( source ).useDelimitr("\\A").next();

이 방법은 데이터 버퍼를 구현하는 노력을 줄여준다. 또한 문자 인코딩방식도 자동으로 UTF-8(JSON, 자바스크립트의 기본 인코딩)에서 UTF-16으로 바꿔주기 때문에 편리하다. 안드로이드는 문자 인코딩 방식으로 UTF-16을 사용하기 때문이다.
















댓글

이 블로그의 인기 게시물

API 요청 URL(URI) 만들기(조합하기) -Uri.Builder사용하기-

TextView에 글자를 넣어주는 방법(setText, append)

텍스트 뷰의 배경을 원형 이미지로 지정하고, 배경 색상 채우기(안드로이드)