Является ли java.net.Socket.setSoTimeout надежным? - PullRequest
2 голосов
/ 10 ноября 2009

Из JavaDoc для setSoTimeout

Включить / отключить SO_TIMEOUT с помощью указанное время ожидания в миллисекундах. Если для этой опции задано ненулевое значение тайм-аут, вызов read () InputStream связан с этим Сокет будет блокировать только на эту сумму времени. Если время ожидания истекло, java.net.SocketTimeoutException поднял, хотя гнездо все еще действительный. Опция должна быть включена до входа в блокировку операция, чтобы иметь эффект. Тайм-аут должно быть> 0. Тайм-аут нуля интерпретируется как бесконечный тайм-аут.

Из множества сообщений в Интернете я читал, что SO_TIMEOUT довольно ненадежен при использовании Socket C API (например, здесь ).

Отсюда возникает вопрос: надежно ли использовать setSoTimeout для проверки на отсутствие сеансов?

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

Ответы [ 4 ]

3 голосов
/ 10 ноября 2009

Я не знаю ни одной соответствующей недавней / текущей операционной системы, в которой тайм-ауты (потоковых) сокетов не работают так, как они должны. Пост, на который вы ссылаетесь, взят из довольно запутанного постера, в котором делается попытка установить тайм-аут отправки для сокета дейтаграммы, что абсолютно бессмысленно. Дейтаграммы отправляются немедленно или без уведомления.

2 голосов
/ 10 ноября 2009

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

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

1 голос
/ 20 марта 2013

Ссылка о SO_RCVTIMEO. Вопрос о Socket.setSoTimeout (). На единственной платформе, о которой я знаю, где первая не работает (некоторые версии Solaris), последняя обманывается с помощью select (), который работает. Контракт метода требует этого. Вам не нужно беспокоиться об этом, если только кто-то не придумает платформу, на которой ее нет, я никогда не видел ее за 16 лет.

0 голосов
/ 10 ноября 2009

Ознакомьтесь с классами подключения в Java 6 nio, они теперь включают сокеты и выполняют неблокирующую операцию, чтобы вы могли отменить операцию, если хотите.

Ядро Apache htmlclient (?) Теперь может использовать сокеты nio, поэтому, похоже, эта концепция работает. Это все, что я знаю об этом.

...