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(); } }
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/15747608.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库