Network

<네트워크 관련 클래스> URL & URLConnection Class

춘햄 2021. 4. 1. 15:21

URL Class를 살펴보기 전에 우선 URL의 구성 성분들에 대하여  훑어보고 넘어가려고 한다.

 

URL의 형식:

프로토콜:// 인터넷 주소[:포트번호] [/디렉토리] [/파일 이름][? 쿼리 스트링] , [] = 생략 가능

https://til-choonham.tistory.com:portNum/log/index.html?id=choonham

 

 - 프로토콜 : 저 원에 접근하기 위해 서버와 통신에 사용되는 통신규약

 - 인터넷주소 : 자원을 제공하는 서버의 주소(이름)

 - 포트번호 : 통신에 사용되는 서버의 포트번호

 - 디렉토리, 파일 이름 : 자원이 저장되어 있는 서버상의 위치

 - 쿼리스트링 : ‘?’ 문자 뒤에 오는 통신에서 사용되는 매개변수

 

이런 기본적인 개념부터 제대로 짚고 넘어가야 클래스를 생성하고 관련 메서드들을 제대로 활용하여 프로젝트를 진행할 수 있다.

 

1. URL Class:

URL Class의 Structual:

URL(String protocol, String host, int port, String file)

URL(String protocol, String host, String file)

URL(String urlString)    //가장 보편적으로 사용된다.

- protocol : 프로토콜

- host : 컴퓨터 이름

- port : 포트 번호

- file : ULR에 존재하는 자원(파일)의 이름

- urlString : 모든 요소를 포함한 문자열

 

 

URL Class의 주요 메서드:

String getFile()

URL 파일 이름 반환

String getHost()

URL 호스트 이름 반환

String getPort()

URL 포트 이름 반환

String getProtocol()

URL 프로토콜 이름 반환

String toExternalForm()

전체 URL 문자열 반환

URLConnection openConnection()

URL 연결 후 URLConnection 객체 반환

InputStream openStream()

URL 정보를 읽기 위한 InputStream 객체 반환


간단한 예제를 통해 확인해보면, 

package com.choonham;

import java.net.MalformedURLException;
import java.net.URL;

public class URLTest {

	public static void main(String args[]) {
		try {
			URL kbs = new URL("http://about.kbs.co.kr/index.html");
			System.out.println("프로토콜: " + kbs.getProtocol());
			System.out.println("포트: " + kbs.getPort());  //포트 번호를 가지고 있지 않으면 -1
			System.out.println("호스트: " + kbs.getHost());
			System.out.println("경로 및 파일: " + kbs.getFile());

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

위와 같이 확인해볼 수 있다. (뭐...딱히 복잡할 건 없다.)

 


2. URLConnection Class:

어플리케이션과 URL간의 통신연결을 위한 작업을 하는 클래스.

URL 내용을 읽어오거나, URL 주소에 "GET / POST" 메소드 형식으로 데이터를 전달할 때 사용하며, 추상 클래스로써 자신의 객체를 생성할 수 없고 URL 객체의 openConnection()을 통해 사용한다

URL -> openConnection() -> URLConnection -> getInputStream -> InputStream(내용읽기) 순의 과정을 거쳐 처리한다. 

URL Class의 openStream()은 입력 스트림만 개설하지만(앞뒤 사정 1도 안따지고 입력 스트림을 요청하기 때문에, 그닥 효율적인 방법은 아니다.) 그러나 URLConnection을 이용하면 입력 스트림과 출력 스트림 모두 개설할 수 있다.

 

마찬가지로 간단한 예시로, 자주 이용하는 프로그래머스의 메인 페이지 Stream을 읽어와보자.


package com.choonham;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

public class URLConnectionTest {

	public static void main(String args[]) throws IOException {
		URL pro = new URL("https://programmers.co.kr/");
		URLConnection pro_con = pro.openConnection();
		System.out.println("문서 타입: " + pro_con.getContentType());

		InputStream is = pro_con.getInputStream(); // 연결된 URL의 input Stream을 얻는다.

		// THIS IS HOW WE READ THE STREAM!!!
		// *Stream은 Binary 정보이므로 아래 방법처럼 형변환하여 읽어야한다.

		int c; // 바이트 단위 값을 저장받을 변수
		System.out.println("InputStream:  ");
		while ((c = is.read()) != -1) { // read() 는 더 이상 읽을 내용이 없을 경우, -1을 반환한다.
			System.out.print((char) c);
		}

		is.close(); // 외부 자원은 사용 후에 반드시 닫자.

	}

}

 

인코딩을 안해서 좀 엉망이긴 한데... 어쨋든 프로그래머스가 가지고 있는 소스를 읽어왔다.

그래도 보기 싫으니까, BufferedReader를 추가해서 인코딩을 해주도록 하자

 


package com.choonham;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class URLConnectionTest {

	public static void main(String args[]) throws IOException {
		URL pro = new URL("https://programmers.co.kr/");
		URLConnection pro_con = pro.openConnection();
		System.out.println("문서 타입: " + pro_con.getContentType());

		InputStream is = pro_con.getInputStream(); // 연결된 URL의 input Stream을 얻는다.
		BufferedReader in = new BufferedReader(new InputStreamReader(pro_con.getInputStream()));
		
		// THIS IS HOW WE READ THE STREAM!!!
		// *Stream은 Binary 정보이므로 아래 방법처럼 형변환하여 읽어야한다.
		/*
		int c; // 바이트 단위 값을 저장받을 변수
		System.out.println("InputStream:  ");
		while ((c = is.read()) != -1) { // read() 는 더 이상 읽을 내용이 없을 경우, -1을 반환한다.
			System.out.print((char) c);
		}
		*/
		String thisLine = null;
		while((thisLine = in.readLine()) != null) {
			System.out.println(thisLine);
		}
		
		is.close(); // 외부 자원은 사용 후에 반드시 닫자.

	}

}

편-안...

 

URL 관련 Class들을 살짝 핥아 봤는데...좀 더 심화적인 내용은 다음에 포스팅하도록 하겠다.

 

 

끝!