개발환경 : JDK 1.5, eclipse-galileo, Google API 7(android API 2.1), window XP |
org.apache.http.client.HttpClient 클래스는 안드로이드 뿐만 아니라 여러가지로
쓸만한데가 많아서 몇가지 예제를 정리 하였다. 나 같은 경우에는 안드로이드에서
서버와 통신하며 데이터를 받아올 때 사용한다. 안드로이드 API 내부에 HttpCliet
가 포함되어있기 때문이다.
(1) HttpClient 를 이용하여 POST 방식으로 멀티파일 업로드 구현 |
이 예제는 java application 으로 만든것이다. 서버에 WAS 가 돌고 있다면 멀티 파일 업로드가
가능하다. 로컬상에 web application 하나 구현해 놓고 테스트 해보면 될것이다.
import java.io.File; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.ContentBody; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.util.EntityUtils; public class PostFile { public static void main(String[] args) throws Exception { HttpClient httpclient = new DefaultHttpClient(); httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpPost httppost = new HttpPost("http://localhost:9001/upload.do"); File file = new File("c:/TRASH/zaba_1.jpg"); MultipartEntity mpEntity = new MultipartEntity(); ContentBody cbFile = new FileBody(file, "image/jpeg"); mpEntity.addPart("userfile", cbFile); httppost.setEntity(mpEntity); System.out.println("executing request " + httppost.getRequestLine()); HttpResponse response = httpclient.execute(httppost); HttpEntity resEntity = response.getEntity(); System.out.println(response.getStatusLine()); if (resEntity != null) { System.out.println(EntityUtils.toString(resEntity)); } if (resEntity != null) { resEntity.consumeContent(); } httpclient.getConnectionManager().shutdown(); } }
(2) HttpClient 를 이용하여 일반 데이터 전송/ 받기 |
이 예제는 파일이 아닌 일반 text 데이터를 BasicNameValuePair 담아서 전송한다. 하나하나 담은
데이터는 다시 ArrayList 클래스에 넣고 UrlEncodedFormEntity 클래스로 UTF-8 로 인코딩한다.
서버에서 작업된 내용을 받을때는 ISO-8859-1 디코더해서 BufferedReader 로 읽어 들인다
그리고 마지막에 getConnectionManager().shutdown() ; 해준다.
InputStream is = null; String totalMessage = ""; String url = "http://192.168.0.10:8080/soccer.do?method=list"; HttpClient httpclient = new DefaultHttpClient(); try { /** 연결 타입아웃내에 연결되는지 테스트, 5초 이내에 되지 않는다면 에러 */ String id = "id"; String pwd = "password"; ArrayListnameValuePairs = new ArrayList (); nameValuePairs.add(new BasicNameValuePair("ID", id)); nameValuePairs.add(new BasicNameValuePair("PWD", pwd)); /** 네트웍 연결해서 데이타 받아오기 */ String result = ""; HttpParams params = httpclient.getParams(); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params, 5000); HttpPost httppost = new HttpPost(url); UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity(nameValuePairs, "UTF-8"); httppost.setEntity(entityRequest); HttpResponse response = httpclient.execute(httppost); HttpEntity entityResponse = response.getEntity(); is = entityResponse.getContent(); /** convert response to string */ BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } is.close(); result = sb.toString(); } catch (IOException e) { e.printStackTrace(); } chatch (Exception e) e.printStackTrace(); } finally { httpclient.getConnectionManager().shutdown(); }
위의 내용은 아이디/패스를 서버에 전달하고 그 결과값을 받기 위해서 만들었던 것이다.
서버나 네트웍 상태가 안좋아서 데이터를 받아 올수 없을 때 무작정 기다릴수 없으므로
5초로 셋팅해주었다. 5초 이상 반응이 없으면 exception 을 던지게 된다.
이것으로 안드로이드에서 실시간 서비스정보구현을 위한 기본적인 코딩은 된것이다.
추가로 구현해야될 사항은 네트웍 연결부분을 별도의 쓰레드로 돌려야 되고 , 데이터를
받고 전달해줄 서버를 구현해야한다. 그리고 JSON 프로토콜을 사용할것이 때문에
JSON 파싱을 위한 구현을 해야한다.
'안드로이드 개발' 카테고리의 다른 글
iPhone 개발시 text 박스 입력할 때 키패드 사용후 감추기 (0) | 2010.07.31 |
---|---|
iPhone(아이폰) DB 개발시 Sqlite3 용 클래스 FMDB (3) | 2010.07.31 |
Android 에뮬레이터에 apk 파일 설치 (0) | 2010.07.31 |
안드로이드(Android) 단말기에서 ConnectivityManager 를 통해 실시간 네트웍 상태 파악하기 (29) | 2010.07.31 |
안드로이드 (android) 네트워크 프로그램에서 HttpClient 사용시 Connection Timeout 체크하기 (7) | 2010.07.29 |
안드로이드 위젯 컨트롤에 round 적용과 디자인 업그레이드 - Shape Drawable (1) | 2010.07.29 |
안드로이드에서 2D 그래픽을 표현하기 위한 예제들 (0) | 2010.07.28 |
안드로이드(Android) 한글 로그 출력시 문자 깨지는 경우 (0) | 2010.07.28 |