Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

안드로이드(android)에서 java HttpClient 4.0 클래스를 이용한 네트웍 프로그램 구현

 

개발환경 : 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";
	
	ArrayList nameValuePairs = 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 파싱을 위한 구현을 해야한다.

반응형
Posted by 녹두장군

댓글을 달아 주세요

  1. Gabriel. 2012.01.20 12:10  댓글주소  수정/삭제  댓글쓰기

    오~ 좋네요.. 개발시 참고 하도록 하겠습니다.. ^^
    감사합니다..

  2. 안됨 2013.01.10 15:05  댓글주소  수정/삭제  댓글쓰기

    MultipartEntity가 없는 함수라고 나옵니다
    안드로이드 OS 업데이트 하면서 없어 진건가요??

    이렇게 올려놓은 사람들이 많던데

    • 녹두장군 2013.01.21 10:25  댓글주소  수정/삭제

      이건 조만간에 수정해서 현재 버전에 맞는 내용을 올리 도록 하겠습니다

    • 방사능냠냠 2014.10.22 16:32  댓글주소  수정/삭제

      아파치에서 제공하는 HttpClient 라이브러리를 추가해야합니다.
      이 게시글을 참고하세요!
      http://trend21c.tistory.com/1469