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)
{

}

person Arci    schedule 08.05.2012    source источник
comment
Перепечатка: stackoverflow.com/questions/9986712/   -  person Krrose27    schedule 08.05.2012
comment
Зачем вы задаете вопрос, на который у вас уже есть ответ?   -  person user207421    schedule 08.05.2012
comment
@Krroae27: Спасибо, что упомянули об этом. Мои извенения. Я временно прекращаю работу над этой проблемой, чтобы заняться другой задачей. Я забыл, что уже задавал подобный вопрос раньше.   -  person Arci    schedule 08.05.2012
comment
@EJP: я забыл о своем предыдущем посте. Кроме того, я не удовлетворен ответами на мой предыдущий пост. Я пытаюсь удалить этот пост, но уже не могу, так как уже есть ответ.   -  person Arci    schedule 08.05.2012
comment
@Arci Ответы в вашем предыдущем посте идентичны ответу в этом.   -  person user207421    schedule 08.05.2012
comment
Почему вы ловите и игнорируете Exception?   -  person user207421    schedule 08.05.2012
comment
@EJP: я не игнорирую это, я просто не указал здесь код того, как я с этим справляюсь. Но я каким-то образом обрабатываю исключение. Кстати, я уже нашел причину своей проблемы. ›_‹ Но я также ценю ваш ответ. Спасибо!   -  person Arci    schedule 08.05.2012
comment
Что ж, мы можем комментировать только код, который вы на самом деле публикуете.   -  person user207421    schedule 08.05.2012


Ответы (2)


Почему время ожидания моего сокета истекло так рано, когда время ожидания подключения и чтения установлено на бесконечность?

Код пожалуйста.

Тайм-аут сокета отличается от тайм-аута подключения и чтения? Если да, то чем он отличается?

SocketTimeoutException — тайм-аут чтения.

Как я могу узнать значение тайм-аута моего сокета? Я использую HttpURLConnection.

HttpURLConnection.getReadTimeout(); также HttpURLConnection.getConnectTimeout().

Есть ли способ установить время ожидания сокета? Как?

HttpURLConnection.setReadTimeout().

Вы уже указали все эти методы в своем в">исходный пост. Почему вы спрашиваете о них здесь?

person user207421    schedule 08.05.2012
comment
Спасибо! Я уже обновил свой вопрос, включив в него фрагмент кода. Как я уже говорил ранее, я забыл о своем первоначальном посте. Я пытался удалить этот пост, но уже не могу, потому что уже есть ответ. Во всяком случае, мой readTimeout использует значение по умолчанию, которое равно бесконечности. Я также проверил это с помощью getReadTimeout, и значение равно 0. - person Arci; 08.05.2012

Наконец-то я нашел причину моего тайм-аута! Оказывается, это действительно сервер, который вызывает мой тайм-аут. Сначала я сомневаюсь в этом, потому что при использовании iOS я получаю другое время ожидания, которое составляет более 1 минуты.

Итак, вот оно: Операционная система, на которой установлен мой сервер Tomcat, — Windows. Количество попыток Windows по умолчанию для соединения без ответа равно 2. Таким образом, если ваша первая попытка соединения не удалась, у вас все еще остается 2 попытки. Все повторные попытки выполняются внутри. Я не уверен, как рассчитывается время каждой попытки, но в основном это 3 + 6 + 12 = 21 секунда.

  • 1-я попытка = 3 секунды
  • 2-я попытка = 6 секунд
  • 3-я попытка = 12 секунд

После 3-й попытки соединение будет прервано. Также к тому моменту вы уже ждали 21 секунду.

person Arci    schedule 08.05.2012
comment
(1) Windows не является причиной этого. Вы описали поведение Windows при подключении. Ваш вопрос касается поведения Android при подключении. (2) Если вы получили SocketTimeoutException при попытке подключения, это ошибка платформы Android. Он должен был выдать ConnectException с сообщением «время ожидания соединения истекло». SocketTimeoutException предназначен только для чтения и принятия, как сказано в Javadoc. - person user207421; 13.11.2014