netty的通道建立与关闭流程

2022-10-17  本文已影响0人  天草二十六_简村人

一、建立通道

image.png

二、关闭通道

image.png

三、事件触发器

3.1、ClientHandler

@Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
            if (idleStateEvent.state() == IdleState.WRITER_IDLE) {
                ProtobufData.Task pingPack = TaskPackage.heartBeatPing();
                ctx.channel().writeAndFlush(pingPack);
            }
        }
        super.userEventTriggered(ctx, evt);
    }

3.2、NettyServerHandler

@Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;

            if (idleStateEvent.state() == IdleState.READER_IDLE && ctx.channel().hasAttr(ChannelSessionManager.SESSION)) {
                UserInfo userInfo = ChannelSessionManager.getChannelSession(ctx.channel(), UserInfo.class);
                String roomId = userInfo.getAppKey() + Constants.ROOM_SEPARATOR_WORD + userInfo.getRoomId();
                String userId = userInfo.getUserId();
                cleanChannel(roomId, userId, ctx.channel().id());
            }
        }
        ctx.channel().close();

        super.userEventTriggered(ctx, evt);
    }

四、异常事件

@Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        ctx.channel().close();
    }
上一篇 下一篇

猜你喜欢

热点阅读