2015-07-28 157 views
1

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

回答

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()); 
      } 
     } 
    } 
} 

下面的例子將關閉在第一次讀到空閒,並嘗試在寫入空閒發送ping。也可以實現「pong」響應,並且也將讀取部分更改爲ping請求......您希望處理與協議相關的保持活動的方式。

這可以在客戶端和服務器端完成。

相關問題