我想使用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
的新方法?
答案 0 :(得分:2)
根据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空闲时关闭,并尝试在写入空闲时发送ping。人们也可以实施&#34; pong&#34;响应,也将读取的部分更改为ping请求...您希望处理保持活动与协议相关的方式。
这可以在客户端和服务器端完成。