Java socketChannel для обнаружения беспорядочно закрытого соединения

Я знаю, что SocketChannel «уведомляется» об упорядоченном закрытом соединении, получая «-1» после вызова read().

Но как он может уведомить меня о беспорядочно закрытом соединении? (как часть всего сервера на основе NIO, работающего с селектором и неблокирующими каналами сокетов)


person slashms    schedule 04.05.2017    source источник
comment
Зачем некоторым -1 этот вопрос? Что в этом плохого? минимум, что вы можете, это объяснить.   -  person slashms    schedule 07.05.2017
comment
Вы получили -1, потому что у вас было упорядоченное закрытое соединение :)   -  person avim    schedule 26.06.2017


Ответы (1)


write() бросит IOException: connection reset. В конце концов. Из-за буферизации TCP этого не произойдет при первой записи после сбоя.

person user207421    schedule 04.05.2017
comment
Спасибо @EJP, но это единственный способ? что, если я рассчитываю читать только как сервер? - person slashms; 04.05.2017
comment
Кроме того, что произойдет, если после беспорядочного закрытия я вызову socket.close()? будет ли он заблокирован, потому что он может дождаться закрытия tcp-соединения ОС? - person slashms; 04.05.2017
comment
Вы можете или не можете получить сброс, если вы только читаете. close() никогда не ждет, если только вы не находитесь в режиме блокировки и не сделали глупостей с SO_LINGER. - person user207421; 05.05.2017