HttpURLConnection을 사용할 때 'get'을 사용하지 않으면 InputStream을 닫아야합니까?HttpURLConnection의 안전한 사용
즉 안전합니까?
HttpURLConnection conn = (HttpURLConnection) uri.getURI().toURL().openConnection();
conn.connect();
// check for content type I don't care about
if (conn.getContentType.equals("image/gif") return;
// get stream and read from it
InputStream is = conn.getInputStream();
try {
// read from is
} finally {
is.close();
}
둘째, 그것의 모든 콘텐츠 완벽하고 읽기 것 전에의 InputStream 를 닫 안전합니까?
기본 소켓을 ESTABLISHED 또는 CLOSE_WAIT 상태로 둘 위험이 있습니까?
매우 흥미 롭습니다. 이 질문은 실제로 내가 동일한 IP에 CLOSE_WAIT 소켓을 많이보고있는 문제에 대한 배경이지만 캐싱 (URLConnection.disconnect()를 명시 적으로 호출하지 않기 때문에) 중 하나 일 것으로 예상됩니다. 재사용해야합니다. – Joel
@Joel : HttpUrlConnection.disconnect()를 호출하면 기본 TCP 소켓이 닫힙니다. 입력 스트림을 닫음으로써 기본 TCP 소켓은 나중에 재사용 할 수 있도록 풀링됩니다.유일한주의 사항은 TCP 연결이 캐시되도록 입력 스트림에서 전체 응답 (또는 전체 오류 응답)을 읽어야한다는 것입니다. 스트림에서 전체 데이터가 실제로 필요 하든지 상관없이 항상 조언을 제공합니다. 내 대답의 게시물을 확인하십시오 – Cratylus
첫 번째 예제에 따라 모든 데이터를 읽지 않으면 어떻게됩니까? 여전히 IS를 닫아야한다고 생각하지만 데이터를 읽지는 않지만 여전히 캐시 된 상태로 유지됩니다 닫은. – Joel