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 секунду.

Другие вопросы по тегам