java.net.HttpURLConnection を用いた実装にあたっての注意点

HttpURLConnectionクラスは,以下のように利用されるのが一般的である.

URL url = new URL("http://foo.com/hoge.html");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
int responseCode  conn.getResponseCode();
InputStream is = conn.getInputStream();

byte[] buf = new byte[1024];
while(len = is.read(buf)) != -1){
  System.out.println(buf);
}

しかし,サイトの中には(telnet foo.com 80 でアクセスできるにもかかわらず) HttpURLConnection.getResponseCode() に対してレスポンスを返さないサーバも存在するようで,結果として getResponseCode() から制御が戻らないという状況に陥る.
このような状況に対応するため,クライアント側で ReadTimeout を設定する方がよい.具体的なコードは以下のとおり:

HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setReadTimeout(5000); //タイムアウト時間は 5000ミリ秒
int responseCode  conn.getResponseCode();

また,必要に応じて setConnectTimeout() も設定するとよいかもしれない.