Dev/Java

[java] HttpClient

창문닦이 2019. 9. 26. 23:00

HttpClient클래스

이 클래스의 가장 주요 기능은 HTTP 메소드를 실행하는 것이다. HTTP 메소드 실행에는 일반적으로 HttpClient 에 의해 내부적으로 처리되는 하나 또는 여러 개의 http request/response 교환이 포함된다.

  • setConnectionTimeout : 연결이 설정 될 때까지 시간 초과를 설정한다. 클라이언트가 서버에 연결을 시도할 때, 연결이 설정되거나 서버가 연결 요청에 응답하기까지 경과 된 시간을 의미한다.
  • setSoTimeout : 연속 된 두 패킷 사이의 비활성 시간 또는 시간 차이를 설정한다. 연결을 설정 한 후 클라이언트 소켓은 요청을 보낸 후 응답을 기다린다. 서버가 응답하기 전에 클라이언트가 서버에 요청을 보낸 이후의 경과 시간을 의미한다. 연결 후 클라이언트 측에 도착하는 2 개의 연속 데이터 패킷 사이의 최대 기간 비활성이 설정된다.
  • http.connection-manager.timeout : MultiThreadedHttpConnectionManager는 HTTP 연결 풀을 사용한다. 호스트 세트 당 최대 값과 최소값이 있습니다. 특정 호스트에 대한 모든 연결이 최대 값에 도달 한 경우 동일한 호스트에 대한 새 연결 요청은 기존 연결 중 하나가 사용 가능할 때까지 대기해야한다. 이 매개 변수는 연결 요청이 이루어지고 HttpConnectionManager가 연결을 반환하기 전의 경과 시간이다.

SocketConfig, RequestConfig, ConnectionConfig 클래스

  • SocketConfig : 소켓 관련 환경 설정 클래스 (Socket Configuration)
    • setSoKeepAlive : 헷갈려서 밑에 추가로 개념 정리를 했다.
    • setSoTimeout : 소켓이 연결된 후 inputStream에서 읽는 타임아웃 시간
  • RequestConfig : 변경 불가능한 캡슐화된 요청 관련 환경설정 클래스 (Request Configuration)
    • setConnectTimeout : 커넥션을 맺는 타임아웃 시간(3-ways handshake) 리밋을 설정할 수있다.
    • setSocketTimeout : 커넥션을 맺은 후  타임아웃 시간 동안 응답이 없으면 해제
    • setConnectionRequestTimeout : ConnectionManager(커넥션풀)로부터 꺼내올 때의 타임아웃
  • ConnectionConfig : http 연결 관련 환경 설정 클래스 (HTTP Connection Configuration)
// 세부적인 옵션을 빌더 패턴으로 설정. 소켓 튜닝
SocketConfig socketConfig = SocketConfig.custom()
       .setSoKeepAlive(false)
       .setSoTimeout(10000) // 수신 데이터의 타임 아웃 시간 
       .build();
       
// 커스텀된 HttpClient 생성
HttpClient request = HttpClients.custom()
			.setDefaultSocketConfig(socketConfig)
            .build();
HttpPost request = new HttpPost(url);

// req 관련 환경설정
RequestConfig requestConfig = RequestConfig.custom()
	  .setSocketTimeout(5000) // 커넥션을 맺는데 걸리는 timeout 시간 설정. millisecond. 5초.
	  .setConnectTimeout(5000) // 커넥션을 맺은 후 응답 대기 timeout 시간 설정.
	  .setConnectionRequestTimeout(5000) // 커넥션풀로부터 꺼내올 때의 timeout 시간 설정.
	  .build();

// 이렇게도 커스텀 설정 가능
request.setConfig(requestConfig);

 

SocketConfig 의 SoKeepAlive 옵션

SoKeepAlive는 TCP 소켓 옵션이다. 이 옵션을 1로 설정하면 일정시간동안 해당 소켓을 통해 어떤 자료도 송수신 되지 않을 때, 커널에서 상대방의 상태를 확인하는 패킷 전송한다. 해당 옵션이 설정되지 않은 상태에서 상대방 시스템이 고장나거나 네트워크 연결이 장시간 문제 발생시 응용프로그램은 계속 응답만 기다리는 상태가 된다. 최하위 레벨에서 HTTP는 TCP 소켓입니다. 따라서 URL을 요청하고 응답을 받으면 하위 레벨에서 원격 서버 소켓에 연결하고 데이터를 보내고 응답을 받는 클라이언트 소켓이 만들어진다.

 

NameValuePair 인터페이스, URIBuilder 클래스

Http 프로토콜을 사용하는 클라이언트들은 클라이언트 -> 서버로 요청을 전송할 수 있다. 이 때, HttpClient Component는 데이터를 함께 전송하기 위해 NameValuePair 인터페이스와 URIBuilder 클래스를 제공한다. 서버로 전송하는 데이터는 보통 name, value 형식으로 구성된다. 

  • NameValuePair 인터페이스 : POST 메소드에서 사용한다. 바디에 request message가 작성된다.
  • URIBuilder 클래스 : GET 메소드에서 사용한다. 쿼리스트링 형태로 매개변수가 url에 붙는다.
HttpPost request = new HttpPost(url);

NameValuePair param = new BasicNameValuePair("name", "wiper2019");
//전송하고자 하는 데이터를 엔티티에 반영
request.setEntity(new UrlEncodedFormEntity(param, "UTF-8"));
URIBuilder builder = new URIBuilder();
builder.setScheme("http");
builder.setHost("192.168.1.99");

//전송하고자 하는 데이터(매개변수) 추가
builder.setParameter("name", "wiper2019");

HttpGet httpGet = new HttpGet(builder.build());

ServerSocket의 close() 메소드

close() 메소드는 소켓의 입력과 출력을 모두 닫는다. 때떄로 연결의 입력이나 출력 중에 어느 하나만 닫고 싶은 경우가 있다. shutdownInput() 그리고 shutdownOutput() 메소드는 연결의 어느 한쪽만 닫는 데 사용된다. 이 두 메소드 중 어느 것도 실제로 소켓을 닫지는 않는다. 대신 스트림이 끝에 도달한 것 처럼 보이도록 소켓에 연결된 스트림을 조정한다.

 

참고 : ServerSocket 수신 단계

1. [서버] 소켓 생성

serverSocket = new ServerSocket(int 포트번호, int 스레드풀사이즈)

2. [클라이언트] 서버에 접속 요청

3. [서버] 클라이언트의 요청을 받아들인다.

Socket socket = serverSocket.accept();
socket.getInetAddress().getHostAddress() // 아이피 주소

 


Reference 

socket 통신에서 접속한 서버의 Address 알아보기 https://www.dante2k.com/420https://cbts.tistory.com/86 [IT일기장]

https://m.blog.naver.com/PostView.nhn?blogId=bringmelove1&logNo=119144741&proxyReferer=https%3A%2F%2Fwww.google.com%2F
SoKeepAlive API : https://docs.oracle.com/javase/6/docs/api/java/net/SocketOptions.html?is-external=true#SO_KEEPALIVE

https://www.codetd.com/ko/article/6866030

https://www.cnblogs.com/trust-freedom/p/6349502.html?utm_source=debugrun&utm_medium=referral  

https://inyl.github.io/programming/2017/09/14/http_component.html 

https://kwonnam.pe.kr/wiki/java/apache_http_client

 

'Dev > Java' 카테고리의 다른 글

[java] Logback 과 Maven  (0) 2019.10.04
[java] JVM, JRE, JDK, 자바 메모리 구조  (0) 2019.09.28
[java] on-heap 과 off-heap  (0) 2019.09.20
[java] 자바 프레임워크  (0) 2019.03.18
[java] jdbc를 활용한 팀 프로젝트 진행(가계부)  (0) 2019.02.07