我想使用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请求...您要处理的保持活动的方式与您的协议有关。

这可以在客户端和服务器端完成。

10-08 16:48