티스토리 뷰

728x90

java.net.URLConnection

- URL 내용을 읽어오거나, URL 주소에 GET / POST로 데이터를 전달 할 때 사용함
- 웹 페이지나 서블릿에 데이터를 전달 수  있음
- URL --> openConnection() --> URLConnection  --> getInputStream --> InputStream (내용읽음)
- URL 의 OpenStream() : URL의 입력 스트림만 개설 (차이점)
- URLConnection : URL의 입력, 출력 스트림 개설

Construct 
protected URLConnection(URL) : 직접 생성 불가능 , OpenConnection으로 연결함
    
Method
addRequestProperty(String a, String b) : 키(a) 와 값(b)을 가지고 요청할 수 있는 
                               Properity 값을 미리 설정해 놓음. 특정 키값을 가지고 읽을 수 있도록 함
connect() : 연결 된 곳에 접속 할때 (connect() 호출해야 실제 통신 가능함)
getAllowUserInteraction() : 연결 된 곳에 사용자가 서버와 통신 할 수 있는 환경 확인(boolean)
                               in/output이 해당 서버 , 연결 포트로 가능한지 확인함
getContent() : content 값을 리턴 받음 (inputStream 값을 리턴 함)
getContent(Class[]) : 위 내용을 class[] 배열 값을 입력함
getContentEncoding() : 인코딩 타입을 String으로 리턴함
getContentLength() : content 길이 (-1 이면 정상적으로 값이 넘어오지 않았음)
getContentType() : content 가 http로 되어 있는지 타입 (ex: http-type )
getDate() : content의 날짜 (new Date(~~) 으로 변환해 줘야 함 / Long 리턴)
getDefaultAllowUserInteraction(): 기본적으로 User와 통신 가능한 상태인지 (boolean)
getDefaultUserCaches() : cache를 사용할 것 인지 (boolean)
getDoInput() : Server에서 온 데이터를 입력 받을 수 있는 상태인지 (본인 상태-default : true)
getDoOutput() : Server에서 온 데이터를 출력 할수 있는 상태인지
                          (Client 상태 -default : false)
getExpiration() : 유효 기간
getFileNameMap() : File Name Map
getHeaderField(int) : Head Field 값 받아옴 (http Head 값)
getHeaderFiled(String) :
getLastModified() : 마지막 수정 시간 

getInputStream() : InputStrema 값을 뽑아냄
getOutputStream() : OutputStream 값을 뽑아냄

setDoInput(boolean) : Server 통신에서 입력 가능한 상태로 만듬 
setDoOutput(boolean) : Server 통신에서 출력 가능한 상태로 만듬
 - Server와 통신을 하고자 할때는 반드시 위 두 method를 true로 해 놔야 함

URL url = null;
URLConnection uc = null;

try{
       url = new URL("http://www.korea.co.kr");
}catch(MalformedURLException me){}

try{    uc = url.openConnection(); }catch(IOException io){}

  System.out.println("output = "+ uc.getDoOutput());
  System.out.println("Input = "+ uc.getDoInput());
  uc.setDoOutput(true);  // 스트림 출력 설정
  uc.setDoInput(true);    // 스트림 입력 설정 -- 기본적으로 입력 스트림
  OutputStream out =null;
  InputStream in = null;
try{
       in = uc.getInputStream();
//   out = uc.getOutputStream();
}catch(IOException ie){}
System.out.println("input = "+ in.toString());
//  System.out.println("out = "+ out.toString());

[예제]
URLConnection을 이용한 Web 페이지 읽어서 저장하기

[WebSpiderWithURLConnection.java]
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;


public class WebSpiderWithURLConnection {
public static void main(String[] args){
if(args.length != 2){
System.out.println("사용법 : java WebSpider URL filename");
System.exit(1);
}
URL url = null;
try{
url = new URL(args[0]);
} catch(MalformedURLException e1){
System.out.println("잘못된 URL 형식입니다.");
System.out.println(e1);
System.exit(1);
}
FileOutputStream fos = null;
try{
URLConnection urlcon = url.openConnection();
String contentType = urlcon.getContentType();
long d1 = urlcon.getDate();
Date d = new Date(d1);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
String sdata = format.format(d);
System.out.println("Content Type :" + contentType);
System.out.println("읽어온 시간 : "+ sdata);
InputStream in = urlcon.getInputStream();
fos = new FileOutputStream(args[1]);
byte[] buffer = new byte[512];
int readcount  =0;
System.out.println("읽어 오기 시작 ");
while((readcount = in.read(buffer)) != -1){
fos.write(buffer,0,readcount);
}
System.out.println(args[1] + "파일에 모두 저장했습니다.");
}catch(Exception ex){
System.out.println(ex);
}finally{
try{
if(fos != null)fos.close();
}catch(Exception e){
}
}
}
}



Get 방식으로 데이터 전달함 (검색 조회해서 결과 저장함)

[GetSearch.java]
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;


public class GetSearch {
public static void main(String[] args){
if(args.length != 2){
System.err.println("사용법 : java  GetSearch  keyword  filename");
System.exit(1);
}
try{
String keyword = URLEncoder.encode(args[0]);
String query = "query="+keyword+"&frm=t1&sm=top_hty";
String u = "http://search.naver.com/search.naver";
System.out.println(u + query);
URL url = new URL(u);
URLConnection connection = url.openConnection();
HttpURLConnection hurlc = (HttpURLConnection)connection;
hurlc.setRequestMethod("GET");
hurlc.setDoOutput(true); // 쓰는 기능 on
hurlc.setDoInput(true); // 읽어 들임 기능 on
hurlc.setUseCaches(false);
hurlc.setDefaultUseCaches(false);
PrintWriter out = new PrintWriter(hurlc.getOutputStream()); // 
out.println(query);
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(hurlc.getInputStream()));
PrintWriter pw = new PrintWriter(new FileWriter(args[1]));
String inputLine = null;
while((inputLine = in.readLine()) != null){
pw.println(inputLine);
}
in.close();
pw.close();
System.out.println("검색 결과가 " + args[1] + "파일에 저장되었습니다.");
}catch(Exception ex){
System.out.println(ex);
}
}
}


Post 방식으로 데이터 전달함

[PostConnection.java]

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;


public class PostConnection {
public static void main(String[] args){
if(args.length != 2){
System.out.println("사용법 : java Postconnection id password");
System.exit(1);
}
try{
String id = URLEncoder.encode(args[0]);
String passwd = URLEncoder.encode(args[1]);
String query = "id="+id+"&passwd="+passwd;
String u = "http://localhost/test.jsp";
System.out.println(u + query);
URL url =new URL(u);
URLConnection connection = url.openConnection();
HttpURLConnection hurlc = (HttpURLConnection)connection;
hurlc.setRequestMethod("POST");
hurlc.setDoOutput(true);
hurlc.setDoInput(true);
hurlc.setUseCaches(false);
hurlc.setDefaultUseCaches(false);
PrintWriter out = new PrintWriter(hurlc.getOutputStream());
out.println(query);
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(hurlc.getInputStream()));
String inputLine = null;
while((inputLine = in.readLine()) != null){
System.out.println(inputLine);
}
in.close();
}catch(Exception ex){
System.out.println(ex);
}
}
}




java.net.URLEncoder - Static method : encode(String, String)
    - Encoding : 아스키 문자가 아닌 문자열들을 특수한 문자들로 변환하는 것 
String  encodeStr = URLEncoder.encode(str,"EUC_KR");
    - 문자셋 : EUC_KR 등 뒤에 붙여줌
    
java.net.URLDecoder - Static method : decode(String, String)
String  decodeStr  = URLDecoder.decode(str,"EUC_KR");


static Method 하나만 존재함
- 네트워크는 데이터를  byte로 전송함, 이를 만드는 것을 Encoder , 
  해제하는 것을 Decoder라고 함

  String data = "테스트 전송";
  String dataconver = null;
  //============ Encoder ==============//
  try{
         dataconver = URLEncoder.encode(data,"KSC5601"); // KSC5601 --> euc-kr
  }catch(UnsupportedEncodingException ie){}
        System.out.println("data = "+ data);
        System.out.println("data conver = "+ dataconver);
  
 
 // ============ Decoder ============== //
  try{
      dataconver = URLDecoder.decode(dataconver,"KSC5601");
  }catch(UnsupportedEncodingException ue){}
        System.out.println("data conver = "+ dataconver);

결과
data = 테스트 전송
data conver = %C5%D7%BD%BA%C6%AE+%C0%FC%BC%DB
data conver = 테스트 전송

출처 : http://zeroit.tistory.com/214