我正在从我的应用程序中逐字复制此方法,该方法尚未完成,但如果事情进展不顺利,它会尝试为我提供超时堆栈跟踪:
protected boolean isHttpAlive() {
boolean isHttpOk = false;
HttpURLConnection httpConnection = null;
try {
URL gurl = new URL("http://www.amazon.com/");
URLConnection connection = gurl.openConnection();
connection.setConnectTimeout(5 * 1000); // 5 seconds!
httpConnection = (HttpURLConnection) connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK)
isHttpOk = true;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (httpConnection != null)
httpConnection.disconnect();
}
return isHttpOk;
}
现在在我的一个测试设备(Droid)上,当出现问题时,我确实得到了the exception但是仅在 6分36秒之后,而不是我设置的5秒在上面的代码中。
getResponseCode()
抛出超时异常。
为什么?
我错过了什么?
答案 0 :(得分:5)
我最好的猜测是,您连接的网址(在本例中为亚马逊)有多个IP地址。
根据documentation中的警告:
如果主机名解析为多个IP地址,则此客户端将按RFC 3484顺序尝试每个IP地址。如果连接到这些地址中的每一个都失败,则会在连接尝试引发异常之前经过多次超时。支持IPv6和IPv4的主机名始终至少有2个IP地址。
编辑:
我仍在研究这个问题,因为我想将我的应用从HTTPClient
转换为URLConnection
。在你的实例中,我不满意超过6分钟。
我也偶然发现this blog。他建议添加connection.setReadTimeout(READ_TIMEOUT_MILLISECONDS);
,不知道这对你的情况是否有帮助。
答案 1 :(得分:-1)
这个代码之王对测试连接并不是很有用。连接错误的原因很多(ip堆栈的每一层都有问题)。 一个例子:你可以有一个连接并且每秒接收一个字节,没有超时但对用户来说不是很有趣......如果你使用“www.amazon.com”作为测试,他们可以给你开个玩笑(我'我自己做; D)