SocketTimeoutException, когда ConnectTimeout и ReadTimeout бесконечны?
Возможный дубликат:
Тайм-аут получения запроса, даже если тайм-аут соединения и тайм-аут чтения установлены по умолчанию (бесконечно)?
Я попытался подключиться к веб-службе и получил SocketTimeoutException
примерно через 20 секунд. Сервер Tomcat, на котором размещен веб-сервис, не работает, поэтому Exception
ожидается. Однако я не установил значение моего ConnectTimeout и ReadTimeout. Согласно документации, значения по умолчанию этих двух являются бесконечными.
Одна из возможностей этого заключается в том, что сервер, к которому я пытался подключиться, имеет свой тайм-аут. Но когда мой друг попытался подключиться к нему с помощью iOS, время его подключения истекло примерно через 1 минуту и 15 секунд. Если сервер выдает тайм-аут, наше соединение должно было истечь почти одновременно. Обратите внимание, что он также использует время по умолчанию вне iOS.
- Почему время сокета истекло так рано, когда время подключения и чтения установлено равным бесконечности?
- Отличается ли время ожидания сокета для подключения и чтения тайм-аута? Если так, как это отличается?
- Как я могу узнать значение времени ожидания моего сокета? Я использую HttpURLConnection.
- Есть ли способ установить время ожидания сокета? Как?
Ниже приведен фрагмент моего кода:
httpURLConnection = (HttpURLConnection) ((new URL("http://www.website.com/webservice")).openConnection());
httpURLConnection.setDoInput(isDoInput);
httpURLConnection.setDoOutput(isDoOutput);
httpURLConnection.setRequestMethod(method);
try
{
OutputStreamWriter writer = new OutputStreamWriter(httpURLConnection.getOutputStream());
writer.write("param1=value1");
writer.flush;
}catch(Exception e)
{
}
2 ответа
Почему время сокета истекло так рано, когда время подключения и чтения установлено равным бесконечности?
Код пожалуйста.
Отличается ли время ожидания сокета для подключения и чтения тайм-аута? Если так, как это отличается?
SocketTimeoutException
это тайм-аут чтения.
Как я могу узнать значение времени ожидания моего сокета? Я использую HttpURLConnection.
HttpURLConnection.getReadTimeout()
; также HttpURLConnection.getConnectTimeout()
,
Есть ли способ установить время ожидания сокета? Как?
HttpURLConnection.setReadTimeout().
Вы уже процитировали все эти методы в своем первоначальном посте. Почему вы спрашиваете о них здесь?
Наконец-то я нашел причину моего тайм-аута! Оказывается, это действительно тот сервер, который вызывает мой тайм-аут. Сначала я сомневаюсь в этом, потому что я получаю другой тайм-аут при использовании iOS, который составляет более 1 минуты.
Итак, вот оно: Операционная система, в которой находится мой сервер Tomcat, - Windows. По умолчанию в Windows число повторных попыток подключения без ответа равно 2. Поэтому, когда ваша первая попытка подключения не удалась, у вас все еще остается 2 повторных попытки. Все попытки повторяются внутри. Я не уверен, как рассчитывается время для каждой попытки, но в основном это 3 + 6 + 12 = 21 секунда.
- 1-я повторная попытка = 3 секунды
- 2-я повторная попытка = 6 секунд
- 3-я повторная попытка = 12 секунд
После 3-й попытки ваше соединение будет разорвано. Также к тому времени вы уже ждали 21 секунду.