Netty 客户端向服务器发送保持活动状态

Netty client send keep alive to server

提问人:Software Qustions 提问时间:7/28/2015 更新时间:7/29/2015 访问量:2052

问:

我想使用 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());
        }
    });

添加到频道后。处理代码应该在哪里? 是实现的新方法吗?IdleStateHandlerIdleStateHandler

Java -服务器 netty 客户端

评论


答:

2赞 Frederic Brégier 7/29/2015 #1

根据 JavaDoc,会根据通道的当前状态生成新事件:IdleStateHandler

  • IdleState#READER_IDLE读取操作超时
  • IdleState#WRITER_IDLE用于写入操作超时
  • IdleState#ALL_IDLE用于读/写操作的超时

然后,您需要在处理程序中实现对这些事件的处理(例如,取自此处的文档):

// 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 请求......您想要处理 keep-alive 的方式与您的协议相关。

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