zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    eclipse如何添加User Library
    Json字符串取值
    日常发现的小工具
    java获取json数组格式中的值
    每日总结一个面试题
    linux下备份还原mysql某个库(完整版)
    linux下安装zookeeper教程
    redis安装及常用命令
    dubbo-admin安装使用
    前端框架 一周使用经验积累
  • 原文地址:https://www.cnblogs.com/vipsoft/p/15747608.html
Copyright © 2011-2022 走看看