• NettyHandler 常用生命周期方法


    NettyHandler 常用生命周期方法

    @Component
    @ChannelHandler.Sharable  //表示这里是线程安全的
    public class ImServerHandler extends ChannelInboundHandlerAdapter {
    
    
        private static final Logger logger = LoggerFactory.getLogger(this.getClass());
     
        /**
         * 一旦连接,第一个执行,表示连接建立,一般心跳会在这里面发送
         * @param ctx
         * @throws Exception
         */
        @Override
        public void handlerAdded(ChannelHandlerContext ctx) throws Exception { 
            logger.info("[客户端] 上线 {} localAddress => {} remoteAddress => {}", ctx.channel().hashCode(), ctx.channel().localAddress(), ctx.channel().remoteAddress());
            //发送心跳包
        }
    
    
        /**
         * 绑定完成,一般在这方法内,做一些登录操作
         */
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {         
            logger.info("全部绑定到线程上,已经是一个完整的逻辑处理链时,会回调此方法:local {} remote {} => {}", ctx.channel().localAddress(), ctx.channel().remoteAddress(), msg);  
            //发送登录消息
        }
    
    
        /**
         * 读取消息
         *
         * @param ctx
         * @param obj
         * @throws Exception
         */
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object obj) throws Exception {
            logger.info("收到客户端发过来的消息:local {} remote {} => {}", ctx.channel().localAddress(), ctx.channel().remoteAddress(), msg);  
            //收到发送来的消息,对 obj 进行解析处理
        }
    
    
        /**
         * 数据读取完毕
         *
         * @param ctx
         * @throws Exception
         */
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
            logger.info("[客户端] 数据读取完成 " + ctx.hashCode() + " => " + ctx.channel().remoteAddress());
            ctx.flush(); //读完后,刷新通道
        }
    
    
        /**
         * 表示不活动状态,XX 离线了-- channelInactive > handlerRemoved
         *
         * @param ctx
         * @throws Exception
         */
        @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            logger.info("[客户端] 离线 localAddress => {} remoteAddress => {}", ctx.channel().localAddress(), ctx.channel().remoteAddress());
            //这边在离线时,处理其它逻辑,比如从注册中心中移除注册
        }
    
    
        /**
         * 断开连接被触发--将XX客户下线信息,推送当前在线的客户
         *
         * @param ctx
         * @throws Exception
         */
        @Override
        public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { 
            logger.info("[客户端] 下线  localAddress => {} remoteAddress => {}", ctx.channel().localAddress(), ctx.channel().remoteAddress()); 
            //基本不用        
        }
    
    
    
        /**
         * 处理异常, 一般是需要关闭通道
         *
         * @param ctx
         * @param cause
         * @throws Exception
         */
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            //出现异常的时候,执行相关操作并关闭通道
            cause.printStackTrace(); //有离线的时候,会触发,这里需要对通道进行关闭,日志可以不打印
            ctx.close();
        }
    }
  • 相关阅读:
    c语言程序设计(学生成绩管理系统)————提供给计算机系c语言初学者参考
    C语言之指针排序
    C语言之冒泡法一
    C语言之统计字符
    C语言之while输出菱形
    C语言之do_while输出菱形
    C语言之素数的判断
    C语言之输出菱形
    基于RT-THREAD的定时鱼缸喂食器设计
    dx/dy=1/y’求其二阶导
  • 原文地址:https://www.cnblogs.com/vipsoft/p/15747608.html
Copyright © 2020-2023  润新知