3 вопроса:
Каково различие между соединением, и считайте тайм-аут для сокетов?
Что тайм-аут соединения устанавливает на среднюю "бесконечность"? В какой ситуации это может остаться в инфинитивном цикле? и что может инициировать это, цикл бесконечности умирает?
Что тайм-аут чтения устанавливает на среднюю "бесконечность"? В какой ситуации это может остаться в инфинитивном цикле? и что может инициировать это, цикл бесконечности умирает?
1) В чем разница между таймаутом соединения и таймаутом чтения для сокетов?
Таймаут соединения - это таймаут установления начального соединения, т.е. завершения квитирования TCP-соединения. Таймаут чтения - это таймаут ожидания чтения данных1. В частности, если сервер не сможет отправить байт через
2) Что означает таймаут соединения, установленный на "бесконечность"? В какой ситуации оно может оставаться в бесконечном цикле? и что может спровоцировать смерть бесконечного цикла?
Это означает, что попытка соединения может потенциально блокироваться вечно. Бесконечного цикла нет, но попытка соединения может быть разблокирована другим потоком, закрывающим сокет. (Вызов Thread.interrupt()
также может помочь... не уверен.)
3) Что означает таймаут чтения, установленный на "бесконечность"? В какой ситуации он может оставаться в бесконечном цикле? Что может привести к завершению бесконечного цикла?
Это означает, что вызов read
на потоке сокета может блокироваться вечно. И снова нет бесконечного цикла, но read
может быть разблокирован вызовом Thread.interrupt()
, закрытием сокета и (конечно же) отправкой данных с другого конца или закрытием соединения.
1 - Это не ... как думал один комментатор ... таймаут на то, как долго сокет может быть открыт или простаивать.
Это значения таймаута, навязываемые JVM для установления TCP-соединения и ожидания чтения данных из сокета.
Если значение установлено на бесконечность, вы не будете ждать вечно. Это просто означает, что у JVM нет таймаута, и за все таймауты будет отвечать ОС. Однако таймауты в ОС могут быть очень длинными. В некоторых медленных сетях я видел тайм-ауты длительностью до 6 минут.
Даже если вы установите значение тайм-аута для сокета, это может не сработать, если тайм-аут произойдет в родном коде. Мы можем воспроизвести проблему на Linux, подключившись к узлу, заблокированному брандмауэром, или отключив кабель на коммутаторе.
Единственный безопасный подход для обработки таймаута TCP - это запуск кода соединения в другом потоке и прерывание потока, когда это занимает слишком много времени.