Netty客户端发送保持活动状态到服务器
问题描述:
我想用Netty编写keep alive命令从客户端到服务器。我发现了IdleStateHandler
的选项。我不知道如何解决这个问题的客户端,这是我的代码:添加IdleStateHandler
频道Netty客户端发送保持活动状态到服务器
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
的新方法吗?
答
根据的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());
}
}
}
}
下面的例子将关闭在第一次读到空闲,并尝试在写入空闲发送ping。也可以实现“pong”响应,并且也将读取部分更改为ping请求......您希望处理与协议相关的保持活动的方式。
这可以在客户端和服务器端完成。