2012-10-31

java Framework/java]Http 통신


java :: http 통신

출처 : http://blog.naver.com/banhong/104373158

얼마전에 자바 어플리캐이션에서 http통신으로 데이터 값을 가져와야 하는것을 개발해야 해서

동작테스트 삼아 만들었쌈~..... 실제는 이렇게 안만들었지만 서도


/**
 *
 */
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author 이준성
 *
 */
public class HttpRequest {

 private String url;


 public HttpRequest(String url) {
 
  this.url = url;
 
 }

 public String request()  {
 
  String returnVal = "";
 
  HttpURLConnection con = null;
 
  BufferedReader br = null;
 
  try {
  
   URL tempCon = new URL(url);
   con = (HttpURLConnection)tempCon.openConnection();
  
   // 메소드 방식설정
   con.setRequestMethod("POST");
   // 헤더 설정
   con.setRequestProperty("Content-Type" , "application/x-www-form-urlencoded");
  
   con.connect();
  
   InputStreamReader isr = new InputStreamReader(con.getInputStream());
   br = new BufferedReader(isr);
  
   String temp = null;
  
   while((temp = br.readLine()) != null) {
   
    System.out.println(temp);
   
   }
     
  }catch(IOException e) {
  
   e.printStackTrace();
    
  } finally {
  
   if(br != null) {
    try {
     br.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  
   con.disconnect();
  
  }
 
  return returnVal;
 }



 /**
  * 동작 테스트
  *
  * @param args
  */
 public static void main(String args[]) {
 
  //HttpRequest 생성시에 인자로 요청을 보낼 주소를 적으면 된다.
  //HttpRequest hr = new HttpRequest("");
  //hr.request();
 
 }

}


자바에서 제공하는 HttpURLConnection 이란 녀석때문에 상당이 쉽게 만들수는 있다지만,
상당히 객체지향적이지 못하게 설계된 클래스라고 하네요. 흠~~ 구런가????

서블릿과의 통신 가능한 클라이언트 작성에 대해서
출처 :

HTTP통신을 하는 서버와 클라이언트를 작성하려고 합니다. 서버측은 서블릿으로 작성을 하였습니다. 클라이언트단은 jsp나 html이 아닌 일반 어플리케이션을 이용해야 합니다. URLConnection클래스를 이용하여 서버에 접속하여 정보를 주고 받게끔 작성하였는데 클라이언트에서 정보를 보내는 것은 가능하나 서버로 부터 오는 정보를 다시 받는 방법을 모르겠습니다. 또한, jsp나 html는 form태크를 써서 서버에서 doPost함수에서 response할 수 있는반면 URLConnection으로 서버에 접속을 하게 되면 URL뒤에 정보가 붙어서 가는 Get방식으로 밖에 전송이 안되네요. 어떤 방법으로 클라이언트를 작성하는 것이 더 원활한 서블릿과의 통신방법이 될 수 있을까요? 아래에 소스를 첨부하겠습니다. 꼭 답변 부탁드릴께요.

<HttpClient>
import java.io.*;
import java.net.*;

import sun.net.www.protocol.http.HttpURLConnection;

public class HttpClient {

  public static void main(String[] args) {
    try {
    URL url = new URL("http://127.0.0.1:8080
                    /servlet/HttpTest?p=abc");
    HttpURLConnection huc = (HttpURLConnection)
                                   url.openConnection();
       
    huc.setDoOutput(true);
          OutputStream os = huc.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    BufferedInputStream bis = new BufferedInputStream
                                    (huc.getInputStream());
           //送信
    bos.write("abc".getBytes());
    bos.flush();
    System.out.println("end");

    //受信
    byte[] r = new byte[3];
    bis.read(r);
    System.out.println("read : "+new String(r));

    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


<HttpServer>
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class HttpServer extends HttpServlet {

  public void service(HttpServletRequest request,
                         HttpServletResponse response)
    throws IOException {
       
     response.getOutputStream();
     BufferedInputStream bis = new BufferedInputStream
                               (request.getInputStream());
    byte[] r = new byte[3];
    System.out.println("start");
    int j = bis.read(r, 0, 3);
    System.out.println("read "+j+" : "+new String(r));
    //受信
    bis.read(r);
    System.out.println("read : "+new String(r));
    String str = request.getParameter("p");
    BufferedOutputStream bos = new BufferedOutputStream
                                     (response.getOutputStream());
    //送信
    bos.write(str.getBytes());
    bos.flush();
    System.out.println("write end ");
    }
}
 
   
 
 
 
2003-10-13 13:37:10.0  /  글번호 : 261780 
::carroty:: 도움이 되실란가 모르겠지만...dangguni
 
무슨 이유 때문인지 잘 모르겠지만, 아무튼 HTTP 통신을 하는 CS를 개발
하시는데, 클라이언트가 어플리케이션이어야 하는 이유를 잘 모르겠습니다. 다들 클라이언트를 웹브라우져안으로 이식하기위해 고생하는데 말이져.


클라이언트를 어플케이션으로 만드실것이라면, 애초에 걍 소켓 접속을
통해 프로그램을 만드시는 것이 어떤지요.
클라이언트는 걍 어플리케이션, 서버측도 걍 어플리케이션
이게 더 만들기도 편하고(편한가? *^^*) HTTP보다는 강력할 텐데요.

굳이 80 포트를 경유해야 한다면, 어플리케이션이 애플릿을 경유하여
작성하는 것도 괜찮은 방법이리라 생각됩니다.

클라이언트 프로그램 <-> 웹 브라우져 <-> (애플릿) <-- internet -->

웹 서버 <- 서블릿 -> core 서버 프로그램

머 이런식으로 하시는 것보다는 아래것이 더 낫지 않나요?

클라이언트 프로그램 <-- internet --> core 서버 프로그램

도움이 되시면 좋겠네염.

즐건 하루 되세염.
 
   
 
 
 
2003-10-13 14:32:08.0  /  글번호 : 261785 
서블릿과 애플리케이션과의 통신의 예javamaster
 
/**
  @explain : 서블릿테스트 클라이언트 by javamaster
*/
 
import java.io.*; 
import java.net.*;
import java.util.*;

import javax.servlet.*; 
import javax.servlet.http.*; 

public class HttpConnector{   
  DataInputStream dis;
  OutputStreamWriter writer; // 플래쉬 쓰기만
  String id; // 이 클라이언트가 서버로부터 할당받은 고유아이디  
  String host;
  public static void main(String[] args){ 
    HttpConnector con = new HttpConnector();
    con.initConnection("http://211.110.15.5/javamaster/servlet/Proxy2"); // 특정 URL로 서블릿 생성
  }

  /**
    @explain : 초기 접속 협상을 시도함
    @packet : 000    
  */
  public void initConnection(String _host){      
    host = _host;
    try{      
      URL url = new URL(_host);    
      URLConnection rconnector = url.openConnection();        
      rconnector.setDoOutput(true);
      
      Writer flashwriter = new OutputStreamWriter(rconnector.getOutputStream(), "euc-kr");   
      flashwriter.write("000\n");
      flashwriter.flush();
      flashwriter.close();

      dis = new DataInputStream(rconnector.getInputStream());
      // 이부분에서 무한으로 read() 상태에 있게 된다. 서버와의 통신부분의 핵심
      String line="";
      
      while((line = dis.readLine()) != null){
        System.out.println("서블릿으로 부터 : " + line);      
        if(line.indexOf("000") == 0){ // 초기접속 ok이므로, 서버로 부터 고유아이디를 받았다면 writer를 생성해야 함
          id = line.substring(line.indexOf(" ") + 1, line.length());
          //writeToServer("001 " + id);          
        }else if(line.indexOf("001") == 0){
          System.out.println("history : writer생성 협상 성공,, 이후 서버스 진행하면 됨");  
        }else{
          // 이곳에서 클라이언트 프로토콜을 위임함
          System.out.println("서버로 부터 : " + line);  
        }
        System.out.println("서버로부터 데이터가 오기를 대기함");
      }      
      System.out.println("모든 것 종료");
      
    }catch(Exception e){
      e.printStackTrace();  
    }finally{
    
    }      
  } 
  /**
    @explain : 연결된 writer 객체를 이용해서 서버로 전송
  */
  public void writeToServer(String _packet){
    try{
      URL url = new URL(host);    
      URLConnection wconnector = url.openConnection();        
      wconnector.setDoOutput(true);
      
      // 현재의 writer를 멤버writer로 등록
      OutputStreamWriter writer = new OutputStreamWriter(wconnector.getOutputStream(), "euc-kr");        
      writer.write(_packet + "\n");
      writer.flush();
      writer.close();
      System.out.println("서블릿에 전송 : " + _packet);
      // 응답을 받기위해 임의로
      BufferedReader reader2 = new BufferedReader(new InputStreamReader(wconnector.getInputStream(),"latin1"));      
      reader2.close();
    }catch(Exception e){
      e.printStackTrace();  
    }
  }
}
                    
위의 소스는 일본 KDDI 무선네트워크 프로젝트를 하면서 작성한 것입니다
서버 - 서블릿 - 무선핸드폰 이 실제 구조이고
서버 - 서블릿 - 애플리케이션 의 구조로 실제 서비스전에 데이터 통신에
대한 무선핸드폰 부분을 가상 테스트 하게 됩니다.
혹시 일본쪽 프로젝트신가요?

테스트를 해보시고 궁금하신거나 다른 부분에 대한 문의가 있으시면
제 홈페이지에 방문해 보시기 바랍니다.
요즘 문서 정리중이라 서블릿 부분이 추가 되어서.
그럼

javamaster wild world


제RssReader_Http통신예.zip


아파치 HttpClient 3.x 기준 설명 ..1-1. HttpClient 소개
HttpClient은 HTTP상에서 커뮤니케이션을 하는 자바 기반의 어플리케이션 개발을 쉽게 할수 있도록 제공한다.
우리가 웹 브라우저 또는 그에 준하는 어플리케이션을 개발한다면 HttpClient은 우리에게 클라이언트 코드 개발에 도움을 줄수있다.
이름에서 의미하는것과 같이 HttpClient는 오직 HTTP 클라이언트 코드을 위한 컴포넌트이지 HTTP 요청을 처리하는 서버측 프로세스을 지원하지는 않는다.
1-2. 설치
현재 아파치 HttpClient 는 3.0.1 안정버전을 지원한다.
Jakarta Commons HttpClient 페이지에서 다운로드 받으면 된다.
(다운로드 페이지: http://jakarta.apache.org/commons/httpclient/downloads.html)
(최신버전 다운로드:
  - http://jakarta.apache.org/site/downloads/downloads_commons-httpclient.cgi
  - http://mirror.apache-kr.org/jakarta/commons/httpclient/binary/commons-httpclient-3.0.1.zip
)
commons-httpclient-3.0.1.zip 를 받아서 압축을 풀고,
commons-httpclient-3.0.1.jar 를 CLASSPATH 에 추가하면 된다.
1-3. 추가 설정(Dependencies)
http://jakarta.apache.org/commons/httpclient/dependencies.html
 

Artifact ID  Type  Version  Scope  URL  Comment
commons-codec jar 1.2  http://jakarta.apache.org/commons/codec/
                       http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi
commons-logging jar 1.0.4  http://jakarta.apache.org/commons/logging/ 
junit jar 3.8.1 test  http://www.junit.org/


[JAVA] httpClient 샘플  ============================
출처 ; http://www.albumbang.com/board/board_view.jsp?board_name=free&no=126


package test;



import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.MultipartPostMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.util.EncodingUtil;

public class HttpClientHelper {
    public HttpClientHelper(String urlStr){
        this.urlStr = urlStr;
        paramList = new ArrayList();
    }

    private String urlStr = "";
    private String content = "";
    private int methodType = 0;
    private int iGetResultCode = 0;
    private int connectionMaxTime = 5000;

    private static final int GETTYPE = 0;
    private static final int POSTTYPE = 1;
    private static final int MULTIPARTTYPE = 2;

    public String getContent() {
        return content;
    }

    public int getIGetResultCode() {
        return iGetResultCode;
    }

    private List paramList = null;

    public void setParam(String key, String value) {
        paramList.add(new NameValuePair(key,value));
    }

    public int getMethodType() {
        return methodType;
    }

    public void setMethodType(int methodType) {
        this.methodType = methodType;
    }

    public int execute() {
        iGetResultCode = 0;
        HttpClient client = null;
        HttpMethod method = null;
        NameValuePair[] paramArray = new NameValuePair[paramList.size()];
        paramList.toArray(paramArray);
        try {
            client = new HttpClient(new MultiThreadedHttpConnectionManager());
            client.setTimeout(getConnectionMaxTime());

            if(methodType == GETTYPE){
                GetMethod getMethod = new GetMethod(urlStr);
                if(paramArray.length > 0)
                    getMethod.setQueryString(EncodingUtil.formUrlEncode(paramArray,"euc-kr"));
                method = getMethod;
            }else if(methodType == POSTTYPE){
                PostMethod postMethod = new PostMethod(urlStr);
                for(int k = 0; k < paramArray.length; k++){
                    postMethod.addParameter(paramArray[k].getName(), new String(paramArray[k].getValue().getBytes(),"ISO-8859-1"));
                }
                method = postMethod;
            }else if(methodType == MULTIPARTTYPE){
                MultipartPostMethod multipartPostMethod = new MultipartPostMethod(urlStr);
                for(int k = 0; k < paramArray.length; k++){
                    multipartPostMethod.addParameter(paramArray[k].getName(), paramArray[k].getValue());
                }
                method = multipartPostMethod;
            }
            // method.setFollowRedirects(true);

            iGetResultCode = client.executeMethod(method);
            if(iGetResultCode == HttpStatus.SC_OK)
            {
                content = method.getResponseBodyAsString();
            }
        } catch (Exception e) {
            iGetResultCode = 0;
        }finally{
            if(method != null) method.releaseConnection();
        }
        return iGetResultCode;
    }

    public int getConnectionMaxTime() {
        return connectionMaxTime;
    }

    public void setConnectionMaxTime(int connectionMaxTime) {
        this.connectionMaxTime = connectionMaxTime;
    }
}



--------------------------------------------------------------------------------


package test;



import gshs.eshop.common.httputil.HttpClientHelper;



public class TestSimple {
    private void testPostMethod() {
        System.out.println("testPostMethod() start ###################################");

        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        // 넘겨줄 파라미터 세팅
        test.setParam("act", "/servlet/KBoard?tableName=kjsp");
        // setMethodType을 지정하지 않으면 default = 0, (0:get, 1:post, 2:multipart)
        test.setMethodType(1);
        // connection 연결시간 설정 default = 5000;
        test.setConnectionMaxTime(5000);

        int rtnCode = test.execute(); // 실행하기
        System.out.println(rtnCode); // 결과 값. 200이면 정상
        System.out.println(test.getIGetResultCode()); // rtnCode 값을 결과 값이다.
        System.out.println(test.getContent()); // 해당 페이지의 내용 불러오기
    }

    private void testGetMethod() {
        System.out.println("testGetMethod() start ###################################");
        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        test.setParam("act", "/servlet/KBoard?tableName=kjsp");
        // setMethodType을 지정하지 않으면 default = 0, (0:get, 1:post, 2:multipart)
        test.setMethodType(0);
        // connection 연결시간 설정 default = 5000;
        test.setConnectionMaxTime(5000);

        int rtnCode = test.execute();
        System.out.println(rtnCode); // 결과 값. 200이면 정상
        System.out.println(test.getIGetResultCode()); // rtnCode 값을 결과 값이다.
        System.out.println(test.getContent()); // 해당 페이지의 내용 불러오기
    }

    private void testGetMethodSample() {
        System.out.println("testGetMethodSample() start ###################################");
        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        test.setParam("act", "/servlet/KBoard?tableName=kjsp");
        // setMethodType을 지정하지 않으면 default = 0, (0:get, 1:post, 2:multipart)
        test.setMethodType(0);
        // connection 연결시간 설정 default = 5000;
        test.setConnectionMaxTime(5000);

        int count = 5;
        int rtnCode = 0;
        for (int i = 0; i < count; i++) {
            System.out.println("count : " + (i + 1));
            rtnCode = test.execute();
            if (rtnCode == 200) {
                break;
            }
        }
        if (rtnCode == 200) {
            System.out.println(test.getIGetResultCode());
            System.out.println(test.getContent());
        }
    }

    private void testNoMethodOnlyUrl() {
        System.out.println("testNoMethodOnlyUrl() start ###################################");
        String urlStr = "http://kkaok.pe.kr/frameset/door.jsp?act=/servlet/KBoard?tableName=kjsp";
        HttpClientHelper test = new HttpClientHelper(urlStr);
        int rtnCode = test.execute();
        System.out.println(rtnCode); // 결과 값. 200이면 정상
        System.out.println(test.getIGetResultCode()); // rtnCode 값을 결과 값이다.
        System.out.println(test.getContent()); // 해당 페이지의 내용 불러오기

    }

    public static void main(String[] args) {
        TestSimple test = new TestSimple();
        test.testGetMethod();
        test.testPostMethod();
        test.testNoMethodOnlyUrl();
        test.testGetMethodSample();
    }
}



HttpClient 4.x버전으로 올라오면서 조쿰 바뀐 것 같습니다.
기록용으로 기록합니다-_-
아래 예제는.....티월드사이트의 무료사용량 조회 예제입니다-_-







출처 : http://mudchobo.tomeii.com/tt/479

Java] HttpClient 4.x 버전 예제


import java.net.URI;import java.util.ArrayList;import java.util.List;
import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.ResponseHandler;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;
publicclassMain{
/**

     * @param args

     */publicstaticvoid main(String[] args)throwsException{HttpClient httpclient =newDefaultHttpClient();

        String id ="t월드 아이디";String pw ="비밀번호";

        List<NameValuePair> qparams =newArrayList<NameValuePair>();

        qparams.add(newBasicNameValuePair("URL","http://www.tworld.co.kr/loginservlet.do?returnURL=http%3A%2F%2Fwww.tworld.co.kr&kind=&popup=&cmd=&reload=&ID="+ id));

        qparams.add(newBasicNameValuePair("ID", id));

        qparams.add(newBasicNameValuePair("PASSWORD", pw));

        qparams.add(newBasicNameValuePair("SERVERIP","203.236.20.129"));

        qparams.add(newBasicNameValuePair("X","0"));

        qparams.add(newBasicNameValuePair("Y","0"));UrlEncodedFormEntity entity =newUrlEncodedFormEntity(qparams,"UTF-8");HttpPost httpPost =newHttpPost("http://nicasams.sktelecom.com:2040/icas/fc/LogOnSV");

        httpPost.setEntity(entity);

        ResponseHandler<String> responseHandler =newBasicResponseHandler();String responseBody ="";HttpResponse response = httpclient.execute(httpPost);Header[] headers  = response.getAllHeaders();

        httpclient =newDefaultHttpClient();HttpGet httpGet =newHttpGet();if(headers.length >1){String url = headers[1].getValue();System.out.println("url = "+ url);

            httpGet.setURI(new URI(url));

            responseBody = httpclient.execute(httpGet, responseHandler);System.out.println(responseBody);}

        httpGet.setURI(new URI("http://www.tworld.co.kr/normal.do?serviceId=S_BILL0070&viewId=V_CENT0261"));

        responseBody = httpclient.execute(httpGet, responseHandler);

        System.out.println("result = "+ responseBody);}}

댓글 없음:

댓글 쓰기