URLConnection, почему два разных таймаута? (подключиться и прочитать)

Просто любопытство. Есть ли веская причина, по которой класс URLConnection должен иметь два разных таймаута?

connectTimeout - это максимальное время ожидания в миллисекундах при подключении. Подключение к серверу завершится ошибкой с SocketTimeoutException, если время ожидания истечет до того, как соединение будет установлено.

readTimeout - это максимальное время ожидания завершения чтения входного потока перед отказом от него. Чтение завершится ошибкой с SocketTimeoutException, если время ожидания истечет до того, как данные станут доступны.

Можете ли вы назвать мне вескую причину, по которой эти два значения должны отличаться? Почему вызову потребуется больше времени для установления соединения, а не для получения каких-либо данных (или наоборот)?

Я спрашиваю об этом, потому что мне нужно настроить эти значения, и моя идея состоит в том, чтобы установить одинаковое значение для обоих.


person Massimo    schedule 12.12.2014    source источник


Ответы (3)


Допустим, сервер занят и настроен на прием N-соединения, и все соединения являются длинными, и вы внезапно отправляете запрос. Что должно произойти? Стоит ли ждать бесконечно или следует перерыв? Это connectTimeout.

Хотя, скажем, ваш сервер превращает мозг в мертвую службу, просто принимая соединение и ничего не делая с ним (или скажем, что сервер синхронно переходит к базе данных и какое-то время принимает активность, и сервер заканчивается, например, тупик), а с другой стороны, клиент продолжает ждать ответ, что в этом случае делать клиенту? Должен ли он ждать ответа бесконечно или должен истекать тайм-аут? Это таймаут чтения.

person SMA    schedule 12.12.2014
comment
Я искал хотя бы одну причину. Я думаю, что это хороший пример. - person Massimo; 15.12.2014

Тайм-аут соединения - это время, в течение которого вы готовы ждать ответа от сервера. Это не особенно связано с тем, чего вы пытаетесь достичь.

Но предположим, что у вас есть служба, которая позволит вам дать ей большое число, а она вернет свои простые множители. Серверу может потребоваться некоторое время, чтобы сгенерировать ответ и отправить его вам.

У вас могут быть четкие ожидания, что сервер быстро ответит на соединение: возможно, даже задержка в 5 секунд здесь говорит вам, что сервер, вероятно, не работает. Но время ожидания чтения может быть намного больше: может пройти несколько минут, прежде чем вы сможете прочитать ответ сервера на ваш запрос.

person chiastic-security    schedule 12.12.2014

Тайм-аут соединения - это тайм-аут, в течение которого вы хотите установить (в обычных ситуациях TCP) соединение. Тайм-ауты по умолчанию, указанные в RFC в Интернете и реализованные различными ОС, обычно находятся в диапазоне минут (с). Но мы знаем, что если сервер доступен и доступен, он ответит в течение миллисекунд, а в противном случае - нет. Нормальное значение - максимум несколько секунд.

Тайм-аут чтения - это время, в течение которого сервер должен ответить после получения входящего запроса. Таким образом, время ожидания чтения зависит от времени, в течение которого вы ожидаете, что сервер доставит результат. Они зависят от типа запроса, который вы делаете, и должны быть больше, если обработка требует некоторого времени или сервер может быть очень загружен в некоторых ситуациях. Особенно, если вы выполняете повторную попытку после тайм-аута чтения, лучше всего установить тайм-ауты чтения не слишком низкими, обычно в 3-4 раза больше ожидаемого времени.

person Arie van Wijngaarden    schedule 12.12.2014