Мой ход мыслей - это тайм-аут клиента через 20 секунд после отправки пульса на сервер, клиент не получал от сервисной стороны никаких новостей в течение 30 секунд в качестве тайм-аута, инициирует переподключение, проблема в том, что клиент получил сообщение с сервера для отправки, но также будет вызывать writerIdleTime, на данный момент, я думаю, что ссылка для отправки биения не требуется, надеюсь на вашу помощь
public class HeartbeatHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleState state = ((IdleStateEvent) evt).state();
switch (state) {
case READER_IDLE: {
ctx.close();//reconnect
break;
}
case WRITER_IDLE: {
ctx.channel().writeAndFlush(Config.HEARTBEAT_MSG);
break;
}
}
} else {
super.userEventTriggered(ctx, evt);
}
}
@Override
public void channelActive(ChannelHandlerContext ctx) {
ctx.fireChannelActive();//next handler
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
String readMsg = msg.toString();
if (!TextUtils.isEmpty(readMsg) && TextUtils.equals(readMsg, Config.HEARTBEAT_MSG_RECEVER)) {
}else{
ctx.fireChannelRead(msg);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
public class ChannelInitializerHandler extends ChannelInitializer<SocketChannel> {
private NettyTcpClient nettyTcpClient;
public ChannelInitializerHandler(NettyTcpClient nettyTcpClient) {
this.nettyTcpClient = nettyTcpClient;
}
@Override
protected void initChannel(SocketChannel socketChannel) {
try {
socketChannel.pipeline().addLast(StringEncoder.class.getSimpleName(), new StringEncoder(CharsetUtil.UTF_8));
socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024));
socketChannel.pipeline().addLast(StringDecoder.class.getSimpleName(), new StringDecoder(CharsetUtil.UTF_8));
//readeridleTime 30 Seconds sriteIdleTime 20 seconds
socketChannel.pipeline().addLast(IdleStateHandler.class.getSimpleName(), new IdleStateHandler(
3 * Config.DEFAULT_IDLE_TIMEOUT, 2*Config.DEFAULT_IDLE_TIMEOUT, 0, TimeUnit.MILLISECONDS));
socketChannel.pipeline().addLast(HeartbeatHandler.class.getSimpleName(), new HeartbeatHandler());
socketChannel.pipeline().addLast(DispatchMsgHandler.class.getSimpleName(), new DispatchMsgHandler(nettyTcpClient));
} catch (Exception e) {
e.printStackTrace();
}
}
}