NettyHandler 常用生命周期方法

简介: 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();
    }
}

 

目录
相关文章
|
6月前
|
小程序 JavaScript 开发者
小程序生命周期
小程序生命周期
36 1
|
5天前
|
应用服务中间件
生命周期
Servlet接口中一共是5个方法,其中有三个是生命周期方法。 Ø void init(ServletConfig):这个方法会在Servlet被创建后,马上被调用。只会被调用一次!我们可以把一些初始化工作放到这个方法中,如果没有什么初始化工作要做,那么这个方法就空着就可以了。 ² Servlet有两个时间点会被创建:一是在第一次被请求时,会被创建;二是Tomcat启动时被创建,默认是第一种,如果希望在tomcat启动时创建,这需要在web.xml中配置。 Ø void destroy():这个方法会在Servlet被销毁之前被调用。如果你有一些需要释放的资源,可以在这个方法中完成,如果
|
1月前
|
小程序 UED 开发者
小程序的生命周期函数
小程序的生命周期函数
68 1
|
6月前
|
缓存 JavaScript
onActivated 生命周期的使用和介绍
onActivated 生命周期的使用和介绍
396 3
|
6月前
|
前端开发 JavaScript Python
学不懂生命周期函数正常吗?
学不懂生命周期函数正常吗?
|
6月前
|
小程序 前端开发 API
小程序的生命周期以及页面生命周期
小程序的生命周期以及页面生命周期
63 0
|
6月前
将生命周期方法添加到类中
将生命周期方法添加到类中
|
小程序 UED
小程序的生命周期讲解
小程序的生命周期讲解
64 0
IT服务生命周期
IT服务生命周期
346 0
|
编译器
Stemciljs学习之组件生命周期
Stencil 是一个生成 Web Components(更确切地说,是自定义元素)的编译器。Stencil 将最流行的框架的最佳概念结合到一个简单的构建时工具中。 现在让我们一起学习其中的组件生命周期部分。
69 0