问题
我正在维护的应用程序在大约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();
}
}
Run Code Online (Sandbox Code Playgroud)
在一个块中捕获所有异常无疑是不理想的,但它是继承的代码,我不愿意弄乱它.我知道它SocketTimeoutException在21000毫秒后捕获,因为它记录了异常类的简单名称.
线索
我发现了一个问题,即提问者ConnectTimeout在21000毫秒后获得了一个问题,尽管明确地将其设置为40000毫秒.尽管异常类不同,但这很有趣.
我还发现了一个解释不佳的答案,声称服务器端负责21000毫秒的超时.
我的预感
我不认为服务器的任何操作或不作为都可能导致客户端上的套接字超时短于预期.但也许Windows和Android中的TCP堆栈共享一个共同的祖先,或者至少使用类似的连接重试逻辑.
难道Android会将最大连接超时设置为21000毫秒,设置更长的超时时间HttpURLConnection是徒劳的吗?或者这个超时是否可以由移动设备和服务器之间的路径上的某台Windows机器触发?有些Android版本会抛出SocketTimeoutException别人扔的地方ConnectException吗?