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请求......您希望处理与协议相关的保持活动的方式。

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