<네트워크 관련 클래스> URL & URLConnection Class
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, 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들을 살짝 핥아 봤는데...좀 더 심화적인 내용은 다음에 포스팅하도록 하겠다.
끝!