2.3 진저브레드에서 문제가 있어서 수정

 

중간에 소스부분을 붉은색으로 표기

 

 

물론 첨부파일도 수정했으니 확인하시길~

 

 

 

 

어디에 가져가서 어떻게 사용하던 상관 없음

 

다만!! 유용하게 사용하였다면! 그리고 나를 보게된다면!!

 

나에게 초코렛을 사달라!!!

package com.lucia;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import android.util.Log;
/*
만든이 : 고하나 (고또)
만든 날짜 : 2011.02.16
플랫폼 : 윈도 7 64bit, 이클립스, 안드로이드 SDK(2.1 ver7)
/**/

/// HTTP방식으로 데이터를 주고 리퀘스트 받아오는 클래스
/// GET와 POST방식 두가지 다 사용 가능하다.

/// 생성자 호출해서 클래스 인스턴스 생성한 다음
/// request ( URL주소, 방식(GET or POST), 변수명+변수값 ) ;
/// 위 함수로  보내고 받을 수 있다.
public class gsHttpRequester 
{
 /// 리퀘스트 내용을 통채로 저장할 스트링
 public String m_request ;
 
 /// http방식으로 연결을 유지할 커넥션
 static private HttpURLConnection m_con ;
 
 /// 세션 유지에 필요한 쿠키
 static String m_cookies = "" ;
 
 /// 로그인 해서 세션 가지고 있는지 여부
 static boolean m_session = false ;
 
 static long m_sessionLimitTime = 600000 ;  /// 세션 시간제한 (밀리세컨드)
 static long m_sessionTime = 0 ;    /// 세션을 얻은 시간
 
 
 
 
 /// 생성자
 gsHttpRequester( ) 
 {
 
 }
 
 /// 1. 세션이 유지되고있는지 체크
 /// 2. 시간을 넘겼어도 세션 제거하고 false~
 public boolean checkSession( ) 
 {
  if( !m_session )
  {
   return false ;
  }
  
  if( System.currentTimeMillis( ) < m_sessionTime + m_sessionLimitTime )
  {
   /// 제한시간 아직 안넘었음 세션 유지 연장시킴
   m_sessionTime = System.currentTimeMillis( ) ;
   return true ; 
  }
  else
  {
   /// 제한시간을 넘겼음 세션을 제거함
   m_session = false ;
   return false ; 
  }
 }
 
 /// Request를 받되 세션 유지를 위해 쿠키를 저장한다.
 public String requestAndSetSession( String uri, Map<String, Object> params ) throws MalformedURLException, IOException
 {
  /// 일단 주소에 데이터랑 보내고
  String rec = request( new URL(" uri ), "POST", params ) ;
  
  /// 맵에다 Http헤더를 받아냄
     Map<String, List<String>> imap = m_con.getHeaderFields( ) ;
     
     /// 그리고 거길 뒤져서 쿠키를 찾아냄
     if( imap.containsKey( "Set-Cookie" ) )
     {
      /// 쿠키를 스트링으로 쫙 저장함
      List<String> lString = imap.get( "Set-Cookie" ) ;
      for( int i = 0 ; i < lString.size() ; i++ )
      {
       m_cookies += lString.get( i ) ;
      }
      // 2.3에서 정상작동하지 않습니다 .위의 코드로 대처합니다.
      //Collections c = (Collections)imap.get( "Set-Cookie" ) ;
      //m_cookies = c.toString( ) ;
      
      /// 세션을 저장했으니 
         m_session = true ;
     }
     else
     {
      m_session = false ;
     }
     
     /// 돌려주는 값은 리퀘스트값 뿐이지만  m_session값을 셋팅하니까
     /// checkSession( ) 함수를 호출해서 쿠키를 성공적으로 얻었는지 확인 가능함
  return rec ;
  
 }
 
 
 /// 리퀘스트 받아오는 함수
 /// ( URL주소, 방식(GET or POST), 변수명+변수값 ) ;
 protected String request( URL url, String method, Map<String, Object> params) throws IOException 
 {
  /// 받아올 인풋스트림
  /// POST방식일 경우 데이터를 전송할 아웃풋 스트림
  InputStream in = null ;
  OutputStream out = null ;
 
  /// 연결하고 메소드 셋팅함
  m_con = (HttpURLConnection) url.openConnection( ) ;
  ///String wwwstring = URLEncoder.encode( url.toString() ) ;
  m_con.setRequestMethod(method);
 
  /// 인코딩 정의 HTTP방식으로 전송할때는 urlencoded방식으로 인코딩해서 전송해야한다.
  m_con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  /// 인풋스트림 쓸거라고 지정
  m_con.setDoInput(true);
  
  if( m_session )
  {
   m_con.setRequestProperty( "cookie", m_cookies ) ;
  }
  
  /// 포스트방식일 경우 변수를 outputStream생성해서 서버로 전송
  if (method.equals("POST")) 
  {
   /// 데이터를 주소와 별개로 전송한다.
   m_con.setDoOutput(true);       /// 아웃풋 스트림 쓰기위에 아웃풋을 true로 켬
   
   String paramstr = buildParameters( params ) ; /// 파라메터를 문자열로 치환
   
   out = m_con.getOutputStream( ) ;    /// 아웃풋 스트림 생성
   out.write( paramstr.getBytes( "UTF-8" ) ) ;  /// UTF-8포멧으로 변경해서 변수를 쓴다.
   out.flush( ) ;         /// 플러쉬~
   out.close( ) ;         /// 스트림 닫기
   Log.d( "jsonPrint", "post succes" ) ;   /// 로그출력
  }
 
  
  /// 받아온 데이터를 씍위한 스트림
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  
  /// 리퀘스트 데이터를 저장할 버퍼
  byte[] buf = new byte[131072];
  try 
  {
   int k = 0 ; /// 읽은 라인수
   long ti = System.currentTimeMillis( ) ;        /// == 시간 체크용 == 서버에 따라 리퀘스트 오는 시간이 매우 오래걸림
   in = m_con.getInputStream();     /// 인풋스트림 생성
   Log.d( "---recTime---", "" + (System.currentTimeMillis( ) - ti) ) ; /// == 시간 체크용 == inputstream얻는 요기서 시간 10초이상 넘어가면 큰일남
                    /// 갤럭시 S에서 어떤앱은 WebView라던가 Http통신에서 15초인가 넘어가면 세션 끊기는
                    /// 원인을 알 수 없는 경우도 있었음 다른기기 다 잘되는데 오로지 갤럭시 S만!!! 그랬음 참고 바람요
   /// 루프를 돌면서 리퀘스트로 받은내용을 저장한다.
   while (true) 
   {
    int readlen = in.read(buf);
    if (readlen < 1)
     break;
    k += readlen ;
    bos.write(buf, 0, readlen);
   }
   
   m_request = new String( bos.toByteArray( ), "UTF-8" ) ;
   /////// 리퀘스트 받은 내용을 UTF-8로 변경해서 문자열로 저장 /////////////////
   /*
   File fl = new File( "/sdcard/rec.txt" ) ;
   FileOutputStream fos = new FileOutputStream( fl ) ;
   fos.write( bos.toByteArray( ) ) ;
   
   /**/
   return m_request ;
  } 
  catch (IOException e) 
  {
   /// 리퀘스트 받다가 에러가 나면 에러나면서 받은 메세지를 읽는다.
   if (m_con.getResponseCode() == 500) 
   {
    /// 버퍼 리셋하고 에러값 받을 인풋스트림 생성해서 레어메세지 얻기
    bos.reset();
    InputStream err = m_con.getErrorStream();
    while (true) 
    {
     int readlen = err.read( buf ) ;
     if ( readlen < 1 )
      break ;
     bos.write( buf, 0, readlen ) ;
    }
    
    /// 에러메세지를 문자열로 저장
    String output = new String(bos.toByteArray(), "UTF-8");
    
    /// 읽은 에러메세지를 출력한다.
    System.err.println(output);
   }
   throw e;
  } 
  finally /// 500에러도 아니면 그냥 접속 끊어버림.... -_- 안되는데 답있나?
  {
   if ( in != null )
    in.close( ) ;
   if ( m_con != null )
    m_con.disconnect( ) ;
  }
 }
 
 /// 파라메터 받은 값을  "변수명=변수값&" 형식의 텍스트로 변환해주는 함수
 protected String buildParameters(Map<String, Object> params) throws IOException 
 {
  if( params != null )
  {
   return "" ;
  }
  
  StringBuilder sb = new StringBuilder( ) ;
  
  /// 잘 아시겠지만 arg1=초코릿&arg2=아이스크림&arg3=핫초코  이런식으로 만들어서 날린다.
  for( Iterator<String> i = params.keySet( ).iterator( )  ; i.hasNext( )  ;  ) 
  {
   String key = (String) i.next();
   sb.append(key);
   sb.append("=");
   sb.append(URLEncoder.encode(String.valueOf(params.get(key)), "UTF-8"));
   if (i.hasNext())
    sb.append("&");
  }
  return sb.toString();
 }
 
}


첨부파일은 예제를 함께 첨부한 소스

1. 그냥 주고받기

2. POST방식으로 데이터 주고 리퀘스트

3. GET방식으로 데이터 주고 리퀘스트~


귀차니즘에 쩔은 개발자라 더 볼란가 모르겠지만

혹여 문의사항이던 뭐시기던 있으면

E-Mail : kottodat@naver.com

Homepage : kottodat.com


그럼 오늘하루도 모두들 열심히 고생~고생~


profile

킈킈