Java에서 keep-alive를 이용한 HTTP Persistent Connection
컴퓨터/개발 2010/08/18 20:06HTTP의 커넥션은 기본적으로 stateless입니다. 즉, 하나의 request/response에 대해서 하나의 TCP 커넥션을 맺고 난 이후에 커넥션을 재사용하지 않고 끊어버립니다. 이는 새로운 request가 있을 때마다 계속해서 새로운 커넥션을 맺어야 하기 때문에 HTTP/1.1에서는 다수개의 request/response에 대해서도 기존에 맺은 TCP 커넥션을 재사용할 수 있도록 protocol이 추가되었습니다. 이러한 커넥션 재사용을 HTTP Persistent Connection 이라고 합니다.
HTTP/1.1부터 Persistent Connection을 위해서 keep-alive를 지원합니다. 일부 HTTP/1.0 이용하는 웹서버 구현에서 keep-alive가 사용가능하지만 공식적인 스펙으로는 1.0에서는 지원하지 않습니다. Keep-alive를 사용하는 방법은 Connection 속성값에 사용을 명시하면 됩니다.
-
Connection: keep-alive = Persistent Connection 사용
- Connection: close = Persistent Connection 사용 안함
물론 웹서버에서 keep-alive를 지원해야지만 이용가능합니다. 웹서버가 Persistent Connection을 지원하지 않는다면 헤더에 keep-alive를 사용하더라도 Persistent Connection을 사용할 수 없습니다. 따라서 Persistent Connection의 전제 조건은 "웹서버에서 지원해줘야 한다" 입니다.
이 Persistent Connection을 Java에서 사용할 때는 단순히 keep-alive 설정만으로는 사용할 수 없습니다.
Java가 지원하는 HttpURLConnection 객체를 사용시에는 다음의 내용을 만족해야만 Persistent Connection을 사용합니다. 다음의 내용을 만족하지 않으면 커넥션을 재사용할 수 없습니다.
- 커넥션에서 얻은 inputstream을 끝까지 다 읽어야 함. 끝까지 읽지 않으면 HttpURLConnection이 해당 커넥션에 clean 작업을 시행하지 않기 때문에 커넥션을 재사용 불가.
- getInputStream을 하다가 IOException이 발생한 경우, catch에서 커넥션에 getErrorStream 메소드를 호출하지 않으면 clean 작업을 시행하지 않기 때문에 커넥션을 재사용 불가.
따라서 컨텐츠의 내용을 직접 사용하는 경우가 아니라면 HEAD 메소드만을 사용하는게 좋습니다. GET이나 POST를 사용한다면 불필요한 컨텐츠임에도 불구하고 inputStream을 끝까지 읽어야 하기 때문이죠.
Keep-alive 사용 예시
URL realUrl = new URL("http://www.diquest.com/);
uCon = (HttpURLConnection)realUrl.openConnection();
uCon.setRequestMethod("GET");
uCon.setUseCaches(false);
uCon.addRequestProperty("Connection", "keep-alive");
is = uCon.getInputStream();
br = new BufferedReader(new InputStreamReader(is, "utf-8"));
String line = null;
while((line = br.readLine()) != null) {
// 끝까지 읽어야 함
}
} catch (IOException e) {
uCon.getErrorStream();
} finally {
// close 작업 수행
}
http://download.oracle.com/javase/1.5.0/docs/guide/net/http-keepalive.html
http://imhoratiu.wordpress.com/2010/03/22/httpurlconnection-over-https/
'컴퓨터 > 개발' 카테고리의 다른 글
| Java에서 keep-alive를 이용한 HTTP Persistent Connection (0) | 2010/08/18 |
|---|
