Для этого можно использовать встроенный сервис Netty, который будет раз в определенное время пинговать устройство, и при неполучении ответа закрывать канал.
Для этого нужно создать два handler’a, которые добавить в конфигурацию сервера.
Первый — непосредственно handler, отвечающий за обработку событий (пинг и закрытие канала)
public class MyHandler extends ChannelDuplexHandler {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
if (e.state() == IdleState.READER_IDLE) {
ctx.close();
} else if (e.state() == IdleState.WRITER_IDLE) {
ctx.writeAndFlush(ok);
}
}
}
}
Второй – добавить этот хандлер и IdleStateHandler в pipeline:
ServerBootstrap b = new ServerBootstrap(); // (2)
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class) // (3)
.childHandler(new ChannelInitializer<SocketChannel>() { // (4)
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(
new IdleStateHandler(60, 30, 0),
new MyHandler(),
new ChannelsStorage(),
new DiscardServerHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128) // (5)
.childOption(ChannelOption.SO_KEEPALIVE, true); // (6)
У IdleStateHandler
есть парамерты, такие как время пинга, здесь он задан 60 секунд на чтение и 30 секунд на запись (взяты дефолтные параметры из мануала).
Теперь раз в заданный промежуток времени Netty будет проверять доступность канала, и закрывать его, если с той стороны нет ответа. Обработки можно дописать свою после ctx.close();
, например, передавать обработку какому-либо еще обработчику.