我想使用Netty从客户端向服务器编写keep alive命令。我发现IdleStateHandler
的选项。我不知道如何在客户端解决问题,这是我的代码:
public void connect() {
workerGroup = new NioEventLoopGroup();
Bootstrap bs = new Bootstrap();
bs.group(workerGroup).channel(NioSocketChannel.class);
bs.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(0, 0, 300));
ch.pipeline().addLast("logger", new LoggingHandler());
ch.pipeline().addLast("commandDecoder", new CuCommandDecoder());
ch.pipeline().addLast("commandEncoder", new CuCommandEncoder());
}
});
将
IdleStateHandler
添加到频道之后。处理代码应该在哪里?是实现
IdleStateHandler
的新方法吗? 最佳答案
根据JavaDoc,IdleStateHandler
将根据通道的当前状态生成新事件:IdleState#READER_IDLE
用于读取操作超时IdleState#WRITER_IDLE
用于写操作超时IdleState#ALL_IDLE
用于两个读/写操作的超时
然后,您需要在处理程序中实现对这些事件的处理,例如(取自here的文档的示例):
// Handler should handle the IdleStateEvent triggered by IdleStateHandler.
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(new PingMessage());
}
}
}
}
在这里,示例将在第一个READ空闲时关闭,并尝试在Write空闲时发送ping。一个人也可以实现“乒乓”响应,也可以将读取的部分也更改为ping请求...您要处理的保持活动的方式与您的协议有关。
这可以在客户端和服务器端完成。