Класс Java Socket лжет относительно состояния соединения - PullRequest
0 голосов
/ 23 ноября 2010

У нас есть клиент Java, который поддерживает постоянное соединение через сокет с удаленным сервером. Клиент опрашивает таблицу БД каждые 15 секунд, и если появляется новый элемент, он сериализуется и записывает его в сокет.

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

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

LOG.debug("Socket status: bound=" + _socket.isBound() + ", closed=" + _socket.isClosed() + ", connected=" + _socket.isConnected() + ", outputShutdown=" + _socket.isOutputShutdown() + ", inputShutdown=" + _socket.isOutputShutdown());

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

Однако оператор отладки напечатал следующее:

"Socket status: bound=true, closed=false, connected=true, outputShutdown=false, inputShutdown=false"

Я ожидал, что либо закрыто, чтобы быть истинным, либо связано, чтобы быть ложным. Какие реальные значения я получаю, кажется ложью.

Есть ли способ надежно проверить состояние соединения сокета?

Ответы [ 3 ]

6 голосов
/ 23 ноября 2010

Внимательно прочитайте класс сокетов Javadoc .

isConnected Значение true, если сокету удалось подключиться.Имя метода является неправильным, оно было бы более точным, если бы оно было hasConnected .

Как только сокет успешно подключится, он становится истинным и остается истинным.То же самое для isBound .Вы должны попробовать операцию с сокетом и проверить на сбой.

2 голосов
/ 23 ноября 2010

Я не уверен на 100% в этом, но я почти уверен, что базовый API BSD Sockets на самом деле не имеет механизма, позволяющего определить, открыт ли или нет поток TCP;сбой read() или write() - это довольно надежный способ сказать, что поток оборван.

1 голос
/ 01 мая 2012

Java Network Programming от Elliot Rusty Harold предлагает следующий гем:

"... Чтобы узнать, открыт ли сейчас сокет, вам нужно проверить, что isConnected () возвращает true, а isClosed () возвращает falseНапример:

boolean connected = socket.isConnected() && ! socket.isClosed();"

Надеюсь, это поможет.

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