【发布时间】:2015-01-09 20:41:59
【问题描述】:
问题
我维护的一个应用程序在大约 21000 毫秒后不断收到套接字超时,尽管我已经明确设置了更长的超时时间。这个看似神奇的 21000 毫秒值已经出现在其他一些 SO 问题和答案中,我正试图弄清楚它的确切来源。
这是我的代码的精髓:
HttpURLConnection connection = null;
try {
URL url = new URL(urlString);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(45000);
connection.setReadTimeout(90000);
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
// code omitted
}
} catch (Exception e) {
// code omitted
}
finally {
if (connection != null) {
connection.disconnect();
}
}
在一个块中捕获所有异常无疑是不理想的,但它是继承的代码,我不愿意弄乱它。我知道它在 21000 毫秒后捕获了 SocketTimeoutException,因为它记录了异常类的简单名称。
线索
我发现一个提问者得到ConnectTimeout after 21000 ms 的问题,尽管明确将其设置为 40000 毫秒。尽管异常类不同,但这很有趣。
我还发现了一个解释不清的答案,声称the server side is responsible for the 21000 ms timeout。
我的预感
我认为服务器的任何动作或不作为都不会导致客户端上的套接字超时时间短于预期。但也许 Windows 和 Android 中的 TCP 堆栈共享一个共同的祖先,或者至少使用类似的连接重试逻辑。
会不会是 Android 将最大连接超时时间设置为 21000 毫秒,而在 HttpURLConnection 中设置更长的超时时间是徒劳的?或者移动设备和服务器之间路径上的某些 Windows 机器是否会触发此超时?是否某些 Android 版本会抛出 SocketTimeoutException 而其他版本会抛出 ConnectException?
【问题讨论】:
-
“解释不清的答案”肯定是错误的。声称服务器端平台在执行出站连接时的行为会影响其他平台在出站连接到服务器平台时的行为是没有任何意义的。
-
但是来自客户端和服务器之间路径上某处路由器的出站连接呢?我对网络错误和故障如何传播回客户端的理解有点模糊。
标签: android sockets httpurlconnection