2015-07-28 2 views
1

Я хочу написать команду keep keep keep от клиента к серверу с помощью Netty. Я узнал, что вариант 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 на канал. Где должен быть код обработки? Это новый метод, который реализует 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()); 
      } 
     } 
    } 
} 

Вот пример будет закрыть на первом READ простаивает, и попытаться отправить пинг в Write холостых. Можно также реализовать ответ «понг», а также изменить прочитанную часть на запрос ping ... Как вы хотите, чтобы ваш keep-alive был связан с вашим протоколом.

Это может быть сделано как на стороне клиента, так и на стороне сервера.