В чем разница между соединением и временем ожидания чтения для сокетов? - PullRequest
153 голосов
/ 18 июня 2010

3 вопроса:

  1. В чем разница между соединение и чтение время ожидания для сокетов?

  2. Что означает соединение тайм-аут, установленный на «бесконечность»?В какой ситуации он может оставаться в бесконечном цикле?и что может вызвать то, что цикл бесконечности умирает?

  3. Что означает read timeout, установленный в "infinity"?В какой ситуации он может оставаться в бесконечном цикле?и что может вызвать смерть бесконечного цикла?

Ответы [ 2 ]

187 голосов
/ 18 июня 2010

1) В чем разница между соединением и тайм-аутом чтения для сокетов?

Тайм-аут соединения - это тайм-аут при установлении первоначального соединения;т.е. завершение установления соединения TCP.Тайм-аут чтения - это время ожидания чтения данных 1 .В частности, если серверу не удается отправить байт секунд после последнего байта, возникнет ошибка тайм-аута чтения.

2) Что означает тайм-аут соединения, установленный на "бесконечность"?В какой ситуации он может оставаться в бесконечном цикле?и что может привести к тому, что бесконечный цикл умирает?

Это означает, что попытка соединения может потенциально блокироваться навсегда.Не существует бесконечного цикла, но попытка подключения может быть разблокирована другим потоком, закрывающим сокет.(Вызов Thread.interrupt() также может помочь ... не уверен.)

3) Что означает тайм-аут чтения, установленный на "бесконечность"?В какой ситуации он может оставаться в бесконечном цикле?Что может инициировать завершение бесконечного цикла?

Это означает, что вызов read в потоке сокета может блокироваться навсегда.И снова бесконечный цикл отсутствует, но read можно разблокировать с помощью вызова Thread.interrupt(), закрытия сокета и (конечно) другого конца, отправляющего данные или закрывающего соединение.


1 - Это не ... как думал один комментатор ... тайм-аут на то, как долго сокет может быть открыт или простаивает.

7 голосов
/ 18 июня 2010

Это значения времени ожидания, установленные JVM для установления соединения TCP и ожидания чтения данных из сокета.

Если значение установлено в бесконечность, вы не будете ждать вечно. Это просто означает, что у JVM нет тайм-аута, и ОС будет отвечать за все тайм-ауты. Однако тайм-ауты на ОС могут быть очень длинными. В какой-то медленной сети я видел таймауты до 6 минут.

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

Единственный безопасный способ обработки тайм-аута TCP - запустить код подключения в другом потоке и прервать его, если это займет слишком много времени.

...