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

时间:2015-07-28 11:25:13

标签: java client-server netty client-side

我想使用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的新方法?

1 个答案:

答案 0 :(得分:2)

根据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空闲时关闭,并尝试在写入空闲时发送ping。人们也可以实施&#34; pong&#34;响应,也将读取的部分更改为ping请求...您希望处理保持活动与协议相关的方式。

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