1) В чем разница между подключением и временем ожидания чтения для сокетов?
Тайм-аут соединения - это время ожидания при установлении первоначального соединения; т.е. завершение установления соединения TCP. Тайм-аут чтения - это время ожидания чтения данных 1 . В частности, если серверу не удается отправить байт <timeout> секунд после последнего байта, возникнет ошибка тайм-аута чтения.
2) Что означает время ожидания соединения, установленное на "бесконечность"? В какой ситуации он может оставаться в бесконечном цикле? и что может вызвать то, что бесконечный цикл умирает?
Это означает, что попытка подключения может потенциально заблокировать навсегда. Не существует бесконечного цикла, но попытка подключения может быть разблокирована другим потоком, закрывающим сокет. ( Thread.interrupt()
Звонок также может помочь ... не уверен.)
3) Что означает тайм-аут чтения, установленный на «бесконечность»? В какой ситуации он может оставаться в бесконечном цикле? Что может привести к тому, что бесконечный цикл закончится?
Это означает, что вызов read
в потоке сокета может блокироваться навсегда. Еще раз, бесконечного цикла нет, но он read
может быть разблокирован Thread.interrupt()
вызовом, закрытием сокета и (конечно) другим концом, отправляющим данные или закрывающим соединение.
1 - Это не ... как думал один комментатор ... тайм-аут о том, как долго сокет может быть открыт или бездействовать.
HttpURLConnection.getResponseCode()
висел ок. неделю, пока мы не перезапустили процесс. Очевидно, что на стороне JVM не было установлено время ожидания, а также на стороне ОС Linux.Socket.shutdownInput()
не держась за руки? NB. Эти тайм-ауты применяются TCP, а не JVM.