안드로이드 개발 정보
(글 수 1,064)
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
그럼 오늘하루도 모두들 열심히 고생~고생~
킈킈