Нетти-клиент Android повторил обратный вызов WRITER_IDLE - PullRequest
0 голосов
/ 23 мая 2019

Мой ход мыслей - это тайм-аут клиента через 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();
        }
    }
}
...