URL을 호출하는 코드를 작성할 때 Timeout 설정을 하게 됩니다.
아래 코드로 예를 들어보겠습니다.
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 30);
HttpConnectionParams.setSoTimeout(params, 60);
|
* httpComponents:httpclient:4.2.3 버전 코드
setConnectionTimeout() 메서드와 setSoTimeout() 메서드를 이용하여 Timeout 설정을 하고 있습니다.
ConnectionTimeout은 서버와 클라이언트 연결시 임계값인 줄 알고 있었으나 SocketTimeout은 정확히 알지 못했던 것 같습니다.
궁금증 1. ConnectionTimeout과 SocketTimeout은 무엇일까?
먼저 URL로 HTTP 호출을 할 때 어떤 방식으로 수행되는지 이해가 필요합니다.
웹 브라우저에서 네이버에 접속한다고 가정하겠습니다.
웹 브라우저가 네이버 서버에 접속하기 위해 서버와 연결된 상태가 되어야 합니다. 연결을 구성하기 위해서 보통 TCP Connection과 동일하게 3-way Handshake 방식으로 수행하게 됩니다. 3-way Handshake를 정상적으로 수행하게 되면 웹 브라우저와 네이버 서버는 연결된 상태가 되는데요. 이 때까지 소요된 시간을 Connection에 소요된 시간이라고 할 수 있습니다. 즉, ConnectionTimeout은 Connection을 구성하는데 소요되는 시간의 임계치를 의미합니다.
SocketTimeout은 클라이언트와 서버가 연결된 상태 이 후 보통 서버는 데이터를 클라이언트로 전송하게 되는데요. 이 때 하나의 패킷이 아니라 여러 개의 패킷으로 나눠서 전송하게 됩니다. 각 패킷이 전송될 때 시간 Gap이 생길 수 있는데, 이 시간의 임계치를 SocketTimeout이라고 합니다.
ConnectionTimeout과 SocketTimeout을 그림으로 보면 위와 같습니다.
결론적으로 URL을 호출할 때에는 Co nnectionTimeout과 SocketTimeout 설정이 모두 필요합니다. 만약 두 가지 Timeout을 설정하지 않으면 어떤 일이 벌어질까요?
URL 접속시 무한 대기할 수 있습니다. 서버에서 특정 URL을 접속하는 케이스가 있다면 더욱 더 신중히 설정할 필요가 있습니다.
(OS 레벨에서 Timeout이 설정되어 있는 경우 그 설정값이 적용됩니다.)
궁금증 2. ReadTimeout은 무엇인가? ConnectionTimeout 또는 SocketTimeout과는 다른 값일까?
HttpClient 코드를 들여다보면 아래와 같은 코드를 접할 수 있습니다.
/** |
즉, ReadTimeout은 SocketTimeout과 유사하다고 볼 수 있습니다.
각 구현체마다 readTimeout과 socketTimeout을 혼용해서 사용하는 것은 아닌가 생각이 듭니다.
같은 팀이었던 분이 공유해 준 SocketTimeout 재현을 위한 코드입니다.(https://github.com/sukmin/http-cleint-recipe)
참고
-
http://stackoverflow.com/questions/7360520/connectiontimeout-versus-sockettimeout
-
http://stackoverflow.com/questions/18184899/what-is-the-difference-between-the-setconnectiontimeout-setsotimeout-and-http
-
http://stackoverflow.com/questions/3069382/what-is-the-difference-between-connection-and-read-timeout-for-sockets
-
http://www.isi.edu/lsam/publications/http-perf/
'Programing > Java' 카테고리의 다른 글
HashMap, Hashtable, ConcurrentHashMap 동기화 처리 방식 (0) | 2016.12.20 |
---|---|
HashMap, TreeMap 그리고 LinkedHashMap의 차이 (1) | 2016.12.19 |
P를 출력하는 프로그램 P (0) | 2016.11.10 |
Window에서 C++코드를 Java에서 JNI를 이용하여 호출하기 (1) | 2016.10.11 |
Try~Catch~Finally 사용시 주의사항 (2) | 2016.10.06 |