Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


HttpURLConnection 사용예와 개념
 
자바패턴 스터디중에 나왔던 URLConnection의 개념에 대한 간략한 요약을 하여 아티클을 만들었습니다. ( 2004/01/15 ) 165
Written by ienvyou - 최지웅
1 of 1
 


현재 URLConnection만을 이용해서 하는 것이 아니라 전체 애플리케이션의 일부중의

내용을 URLConnection을 이용하여 웹을 핸들링하려 하고 있을겁니다.

우선 간단하게 말씀드리면 일반적인 socket을 이용하여 실제 처리도 가능하나

JDK에서 추상화시켜 http 및 ftp프로토콜의 특성을 살려낸것이라할수 있습니다.

당연히 http만을 예로 들어보면 stateless하다라는 건 알고 계시겠죠?

 
제가 예전에 작성한게 있었는데 노뚜북 어디에 있는지를 모르겠네요...

간단하게 나마 샘플하나 보여드리며 이것으로 무엇을 했었는지를 설명하도록 하죠.. ^^

죄송한데 지금 급하게 만드느라 주석이 없습니다..양해해주세요..

 Source : HttpURLConnection.java



import java.net.*;
import java.io.*;

public class  HttpURLConnectionTest extends HttpURLConnection
{
 static URL url;
 static URLConnection conn;
 static
 {
  try 
  {
   url = new URL("http","java.sun.com", 80,"/"); 
   conn = url.openConnection();
  }catch(Exception e) 
  {

  }
 }
 public HttpURLConnectionTest() 
 {
  super(url);  
  go();
 }
 public void go() 
 {
  try{
   conn.connect();
   System.out.println("++++++++Start+++++++++++");
   System.out.println("getContentType()  : " + conn.getContentType() );
   System.out.println("getContentLength() : " + conn.getContentLength());
   System.out.println("getUseCaches() : " + conn.getUseCaches());
   System.out.println("getContent() : " + conn.getContent());
   System.out.println("getRequestMethod() : " + ((HttpURLConnection)conn).getRequestMethod());
   System.out.println("getResponseCode() : " + ((HttpURLConnection)conn).getResponseCode());
   System.out.println("getResponseMessage() : " + ((HttpURLConnection)conn).getResponseMessage());
   System.out.println(conn);
   System.out.println("++++++++++++++++++++++");
   InputStream is = conn.getInputStream();
   byte [] b = new byte[1024];
   int len = 0;
   while( (len = is.read(b, 0, b.length)) != -1)
   {
    System.out.write(b, 0, len);
   }
  }catch(Exception e) {
   e.printStackTrace();
  }
 }
 public void disconnect(){}
 public boolean usingProxy(){ return false;}
 public void connect() {
  
 }
 public static void main(String[] args) 
 {
  new HttpURLConnectionTest();
 }
}

위의 클래스를 이용하여 실행시켜 보면 프로토콜의 실제 요청과 답에 대한 것이 나오게 되는데 그렇게 하시려면 rfc포맷 http문서를 읽어보셔야 합니다. 하지만 너무 많기에 그냥 http request와 response에 대한 정보만을 알려드리면 request시에 <method><resource identifier><HTTP version><crlf> [<Header>: <value>] <crlf> ......... [<Header>: <value>] <crlf> <crlf> [Entity body] 예제: GET /index.html HTTP/1.1 Accept: text/html Accept: audio/x User-agent: Carouser 로 표현되며 일반 console에서 테스트시에 telnet xx.xx.com 80 이라고 치신후 위의 GET /index.html HTTP/1.1 문자를 입력한후 엔터를 치게 되면 해당 사이트의 root document정보를 얻게 되며 받는 response로는 <HTTP> <result code> [<explanation>]<crlf> [<Header>: <value>]<crlf> ...... [<Header>: <value>]<crlf> <crlf> [Entity body] 예제: HTTP 200 Document follows Date: Sat, 07 Mar 1998 09:59:15 GMT Server: NCSA/1.5.2 Last-modified: Sun, 07 Dec 1997 12:09:04 GMT Content-type: text/html Content-length: 388 의 정보를 얻게 됩니다. 기본적으로 이러한 것을 java측으로 옮겨줄수 있는 것이 urlconnection인데 이것을 이용하여 예전에 미니 검색엔진을 만들어냈습니다. 로봇과도 같은 개념이지요... 검색엔진에 등록하셔보셨죠? 거기에 등록하면 사이트에 로그인이 필요하면 테스트용 id, pass를 입력하도록 하는데 직원을 그곳에 들어가서 content를 찾게 할수도 있는거고 잘 만들어졌다면 로봇을 시켜 돌아다니게 할수도 있겠죠? 예전에 webzip같은 툴을 써보셨나요? 사이트를 통째로 긁어다주는 툴이죠? 말이 조금 다른곳으로 새긴했는데 그래서 제가 만들었던것은 프로젝트때 만들었던 사이트의 정보를 database에서 검색을 하기에는 content를 수집하기에 모자란 지라 가상 로봇을 하나 만들었지요... 걔가 뭐를 하냐면 새벽3시만 되면 깨어나서, 사이트를 뒤지기 시작합니다. 위의 클래스의 파일첨부하니까 한번 실행해보세요... 200 OK사인을 받은 후 content를 html로 다 얻어내게 되거든요? 그렇게 얻어낸 content를 패턴을 통해 분석을 하게 되지요.. ^^ 그 분석을 통하여 anchor tag가 붙여진 애들을 찾게 됩니다. (그 anchor tag를 recursive하게 돌리면 어떻게 될까요?ㅎㅎ 그 사이트를 통째로 뒤질수 있다는 거네요?.. ^^) 그리고 페이지에 붙어있는 메타 태그를 얻어내고 그것을 분석하여 핵심내용을 database에 저장하게 됩니다. 그렇게 하고 난후 사용자의 검색이 있으면 그 페이지의 url과 정보를 사용자에게 보여주게 되는것이죠.. 간단하게 URLConnection에 대하여 알아보았습니다.
 
1
References
 
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD