2012-01-13 2 views
3

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

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

ответ

3

Вы получите исключения для чтения/записи.

В противном случае, если канал зарегистрирован для интереса чтения/записи на селекторе, когда канал сломан, select() вернется, а клавиша выбора для канала будет отображаться на чтение/запись. Вы будете сталкиваться с исключением в следующем чтении/записи.

+0

Спасибо! Похоже, что он работает и для сбоев соединения, поэтому имеет смысл и для чтения/записи. – jbx

+1

* Когда канал сломан, select() вернется, а клавиша выбора канала будет отображаться читаемым/записываемым *, это неверно, пока я читаю из SocketChannel, кабель отключен, 'select() 'продолжает возвращать ** 0 **, и канал больше не будет выбран. Если я читаю или записываю на канал, игнорируя его читаемое/записываемое состояние, 'read()' не возвращает ** - 1 **, он продолжает возвращать ** 0 **, а 'write()' не генерирует исключение , В настоящее время я не нашел способа обнаружить разъединение разъемов, кто-то подсказывает мне? – neevek

+0

@neevek Вы когда-нибудь решали это? –

Смежные вопросы