Откуда берется время ожидания сокета 21000 мс?
Эта проблема
Приложение, которое я поддерживаю, продолжает получать время ожидания сокета примерно после 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();
}
}
Перехват всех исключений в одном блоке, по общему признанию, не идеален, но это унаследованный код, и я не хочу с ним связываться. Я знаю это ловитSocketTimeoutException
через 21000 мс, поскольку в нем регистрируется простое имя класса исключения.
Улики
Я нашел вопрос, где аскер получалConnectTimeout
через 21000 мсНесмотря на то, что он явно установлен на 40000 мс. Это интригует, несмотря на то, что класс исключений отличается.
Я также нашел плохо объясненный ответ, который утверждает, чтосторона сервера отвечает за тайм-аут 21000 мс.
Моя догадка
Я не думаю, что какое-либо действие или бездействие сервера может привести к сокращению времени ожидания сокета на клиенте. Но, возможно, стеки TCP в Windows и Android имеют общего предка или, по крайней мере, используют аналогичную логику повторных попыток соединения.
Может ли быть так, что Android устанавливает максимальное время ожидания соединения 21000 мс и устанавливает более длительное время ожидания вHttpURLConnection
бесполезно? Или этот тайм-аут может быть вызван какой-то машиной Windows на пути между мобильным устройством и сервером? У некоторых версий Android кидаютSocketTimeoutException
где другие бросаютConnectException
?