urlconnection 기능확장으로 편리하게 사용하기

Posted by 겨울에
2011. 6. 27. 17:22 scrap/ Java/JSP
출처 : http://www.okjsp.pe.kr/seq/65126



사용법

 String url = "/test/test.jsp";

//일반적으로 text기반

  byteResult = WebUtil.callUrlConnect(url,null,false);
  out.println("byteResult = "+new String(byteResult));

//binary file

  byteResult = WebUtil.callUrlConnect(url,null,true);

 기능

- jsp,html 등 웹 text기반 resource 호출가능

- xml 유니코드 호출가능 (한글깨짐방지)

-이미지,플래쉬,동영상등 바이너리 데이타 처리하여 파일로 저장 가능

 

 /**<PRE>
  * TODO: 
  * @param serverUrl : 호출할 URL 
  * @param hs : 파라미터를 넘길때 사용할 해쉬테이블
  * @param bBinary : true-> 바이너리 모드로 호출 false->ascii 모드로 호출
  * @return
  * @throws java.net.MalformedURLException
  * </PRE>
  */
 public static byte[] callUrlConnect(String serverUrl,Hashtable hs,boolean bBinary) throws java.net.MalformedURLException
  {
      
   URL url = null;
   URLConnection connection = null;
     
   //binary
   OutputStream outStream = null;
   InputStream inStream = null;
   BufferedInputStream bufInStream = null;
   
   //text
   Writer writer = null;
   java.io.Reader reader = null;
   BufferedReader buf = null;
   
   String output = null;
   StringBuffer sb = new StringBuffer();
   
   byte[] bufferResult = null;
   
   try
   {
    
   
    url = new URL(serverUrl);
 
    connection = url.openConnection();
 
    connection.setDoOutput(true); //post방식:true
    connection.setDoInput(true); //데이타 첨부되는 경우
    //헤더 셋팅- 웹서버마다 헤더정보가 부족하면 405에러를 반환하기도 한다.
    connection.setRequestProperty("Accept","*/*");
    connection.setRequestProperty("Accept-Charset","euc-kr");
 //   connection.setRequestProperty("host",getHostIP());
    connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; i-NavFourF; .NET CLR 1.1.4322)");
    
 
    outStream = connection.getOutputStream();
 
    
    //일반 text 파일 요청시 
    //서버로 데이타를 보낼때.. writer를 사용
    writer = new OutputStreamWriter(outStream);
    //DataOutputStream doutput = new DataOutputStream(outStream);
 
    // form data 를 넣어줄때
    if(hs != null)
    {
     String sKey = null;
     String param = "";
     for (Enumeration e = hs.keys() ; e.hasMoreElements() ;) 
     {
      sKey = (String)e.nextElement();
      param += sKey+"="+(String)hs.get(sKey)+"&";    
     }
 
    
     writer.write(param);    
     //doutput.writeBytes(param);
     
  //   writer.write("&pnum1="+URLEncoder.encode(pnum1));
  //   writer.write("&pnum2="+URLEncoder.encode(pnum2));
    }
    
    
    writer.flush();//내부버퍼에 있는 모든 데이타를 전송하도록 한다.
    writer.close();
    
 //   doutput.flush();
 //   doutput.close();
    
    outStream.close();
    
 //   doutput = null;
    writer = null;
    outStream = null;
 
 //   int response_code = connection.getResponseCode();
     
    //보낸데이타를 받는다.
    inStream = connection.getInputStream();
    
    
    //text 읽을때..
    if(bBinary == false)
    {
     //스트링 버퍼로 변환하기 위해서는 아래처럼 한다.
     //euc-kr로 안하면 euc-kr로 인코딩 안된 문서는 utf-8로 읽어들이면서 sun.io.MalformedInputException을 발생

      //euc-kr하면 xml등을 호출시 유니코드 한글이 ???로 나온다.
     //reader = new InputStreamReader(inStream,"euc-kr");

    

    //cp949로 하면 euc-kr도 커버하면서 xml 유니코드 한글도 잘 나온다.
     reader = new InputStreamReader(inStream, "cp949");
     buf = new BufferedReader(reader);
     
  //   log("----- callUrl Result START---------------------\n");
     while((output = buf.readLine()) != null)
     {
  //    log(output+"\n");
      if(!output.equals(""))
      {
       output.trim();
       sb.append(output+"\r\n");
      }
     }
     
     bufferResult = sb.toString().getBytes();
     
    }else
    {
     //binary로 읽을 때..(이미지,swf등을 다운로드 할때사용하면 됨)
     bufInStream = new BufferedInputStream(inStream);
     
     int bufferOffset = 0;
     int nReadSize = 0;
     int bufferCapacity = bufInStream.available()+1;
     
     System.out.println("--------------------------------------");
     System.out.println("[binary] 초기버퍼사이즈 = "+bufferCapacity);
     
     bufferResult = new byte[bufferCapacity];
     
  //   log("----- callUrl Result START---------------------\n");
 //    while((i = bufInStream.read(bResult)) != -1); 
     
     //BufferedInputStream가 끝이 아닐때까지 돌면서 버퍼에 채우고 채워진 버퍼를 화면에 출력
     while((nReadSize = bufInStream.read(bufferResult, 
              bufferOffset, 
              bufferCapacity-bufferOffset)) != -1)
     { 
      bufferOffset += nReadSize;
 
      System.out.println("[binary] nReadSize = "+nReadSize+"/ bufferOffset = "+bufferOffset);
      
      if(bufferOffset >= bufferCapacity)
      {
       System.out.println("[binary] 버퍼확장 bufferSize = bufferCapacity "+bufferOffset+" = "+bufferCapacity); 
       //bufferResult를 확장한다.
       bufferCapacity *= 2;
       byte[] newBuffer = new byte[bufferCapacity];
       System.arraycopy(bufferResult,0,newBuffer,0,bufferOffset);
       
       //reference를 변경
       bufferResult = newBuffer;
      }
     }
     System.out.println("[binary] 최종 읽은 사이즈 = "+bufferResult.length);
     System.out.println("--------------------------------------");    
 /*    
  * binary file 생성 test 소스 - stream으로 기록해야한다.
     File newFile = new File("/home/webroot/download/logo2.gif");
     
     BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(newFile));
     
     bout.write(bResult); 
     
     bout.flush();
     bout.close(); 
 */       
    }
      
   }catch(java.net.ConnectException e)
   {
    sb = null;
    sb = new StringBuffer();
    sb.append(EventLogManager._CONNECT_ERROR_+" | "+e.toString());
    
   }catch(java.net.SocketException e)
   {
    sb = null;
    sb = new StringBuffer();
    sb.append(e.toString());
    
   }catch(java.io.IOException e)
   {
    sb = null;
    sb = new StringBuffer();
    sb.append(e.toString());
    
   }finally
   {
    
    try
    {
 
 //    System.out.println("통신 스트림 객체 해제중...");
     
     if(writer != null)
     {
      writer.close();
      writer = null;
     }
     
     if(outStream != null)
     {
      outStream.close();
      outStream = null;
     }
     
     if(inStream != null)
     {
      inStream.close();
      inStream = null;
     }
     
     if(reader != null)
     {
      reader.close();
      reader = null;
     }
     
     if(buf != null)
     {
      buf.close();
      buf = null;
     }
     
     if(bufInStream != null)
     {
      bufInStream.close();
      bufInStream = null;
     }     
     
    }catch(java.io.IOException e1)
    {
     e1.printStackTrace(); 
    }
   }
 
   return bufferResult;
  }