Канал блокировки сокета Java NIO подключен / открыт
В настоящее время в нашем приложении мы используем сокетный канал java nio для записи данных.
socketChannel = SocketChannel.open();
socketChannel.setOption(StandardSocketOptions.SO_KEEPALIVE, config.getConnectionKeepAlive());
socketChannel.configureBlocking(true);
protected void trySendEvent(final Object inputEvent) {
final byte[] eventAsBytes = (byte[]) inputEvent;
final ByteBuffer buffer = ByteBuffer.allocate(eventAsBytes.length);
buffer.put(eventAsBytes);
buffer.flip();
int bytesWritten;
try {
bytesWritten = writeEvent(buffer , eventAsBytes);
} catch (final IOException e) {
log.error("No connection with client.");
reconnect();
try {
bytesWritten = writeEvent(buffer , eventAsBytes);
} catch (final IOException ex) {
log.error("Failed to send event to client.");
}
}
}
Когда соединение с равноправного клиента сбрасывается, наше приложение использует исключение ввода-вывода для определения закрытого соединения и повторного подключения.
Хотя соединение закрыто, исключение ввода-вывода не генерируется до тех пор, пока не будет заполнен локальный буфер TCP, то есть первые несколько записей будут в буфере и никогда не будут генерировать исключение. Поэтому первые несколько записей теряются и никогда не отправляются клиенту
Итак, мой вопрос. Есть ли надежный способ проверить состояние сокета??
"Согласно документации java socketChannel.isConnected() возвращает true, если сокет был подключен раньше, чем текущее состояние"
Любая помощь приветствуется!