HttpURLConnection超时设置

Mal*_*chi 119 java url timeout

如果URL连接超过5秒,我想返回false - 使用Java可以实现这一点吗?这是我用来检查URL是否有效的代码

HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
Run Code Online (Sandbox Code Playgroud)

dby*_*rne 194

HttpURLConnection有一个setConnectTimeout方法.

只需将超时设置为5000毫秒,然后捕获 java.net.SocketTimeoutException

您的代码应如下所示:


try {
   HttpURLConnection.setFollowRedirects(false);
   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setRequestMethod("HEAD");

   con.setConnectTimeout(5000); //set timeout to 5 seconds

   return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
   return false;
} catch (java.io.IOException e) {
   return false;
}


  • SocketTimeoutException是IOException的子类.如果两个catch块都做同样的事情,你可以捕获IOException. (5认同)
  • 我将值设置为10分钟.然而它抛出了一个`java.net.ConnectException:连接超时:连接`甚至在2分钟之前就已经开始了.你知道造成这个问题的原因吗? (2认同)
  • @ spaaarky21是对的.但是,如果您正在构建UI并且想要通知用户发生超时,则必须在IOException之前捕获SocketTimeoutException,否则将无法访问. (2认同)
  • **NB !!!**你需要在隐式连接的任何方法之前调用`setConnectTimeout`(基本上所有抛出IllegalStateException的方法如果已连接).理想情况下,使setConnectTimeout(readTimeout)成为调用的第一个方法. (2认同)
  • 它对我不起作用.但是,在添加`con.setReadTimeout()`之后,它按预期工作. (2认同)

ZZ *_*der 109

你可以像这样设置超时,

con.setConnectTimeout(connectTimeout);
con.setReadTimeout(socketTimeout);
Run Code Online (Sandbox Code Playgroud)

  • @Pacerier文档没有明确说明.如果值为负,它会抛出IllegalArgumentException(值为0意味着无限期等待).由于超时是无符号的32位int,我猜最大超时大约是49天(尽管我很怀疑这个值对任何人都有帮助). (7认同)
  • +1这解决了我的问题,我不知道还有读取超时... (3认同)
  • 我们可以指定的超时最大值是多少? (2认同)