как узнать Java Socket мертв - PullRequest
3 голосов
/ 13 января 2010

Я использую объект Java Socket в своем клиентском приложении. Мне нужно знать, когда линия к серверу разорвана или какое-либо событие привело к потере сокета.

Я вижу два метода:

  • перехватывает SocketException при записи или чтении из сокета, учитывая, что эти исключения уничтожают сокет
  • при перехвате этих исключений проверяет метод Socket.isClosed (), чтобы узнать, уничтожил ли он сокет

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

Есть ли лучший способ узнать это?

Ответы [ 4 ]

2 голосов
/ 13 января 2010

Как минимум:

  1. Получение исключения НЕ означает, что сокет всегда мертв, с Socket.setSoTimeout() javadoc:

    Если время ожидания истекло [например, при чтении, возникает исключение java.net.SocketTimeoutException, хотя Socket все еще действует.

  2. Закрытый флаг сокета, похоже, устанавливается только при вызове метода Socket.close(), поэтому я бы не стал полагаться на него.

1 голос
/ 13 января 2010

Обычно это делается по таймауту. Это обязательно, если вы не доверяете другой стороне (как каждый раз). Без тайм-аута злоумышленник может легко сделать ваше приложение, открыв соединения, ничего не отправляя. Как только вы достигнете предела сокетов вашей системы, приложение может даже аварийно завершить работу ...

0 голосов
/ 13 января 2010

Поскольку между сокетами нет ничего, как поддержание активности, вы узнаете, что соединение разрывается только до следующей попытки записи в этот сокет.

0 голосов
/ 13 января 2010

«Мертвое гнездо» можно рассматривать как ненормальное состояние. Это просто ошибочное поведение. Поэтому я не думаю, что вы справитесь с этой ситуацией эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...