Netty 客户端发送 keep alive 到服务器

Netty client send keep alive to server

我想使用 Netty 编写从客户端到服务器的保持活动命令。我发现了 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 两个 Read/Write 操作超时

然后您需要在处理程序中实现对这些事件的处理(示例取自 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。还可以实现 "pong" 响应,也可以将读取部分更改为 ping 请求...您希望处理保持活动状态的方式与您的协议相关。

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