【Netty源码解读和权威指南】第33篇:Netty连接管理与心跳检测——工业级断连处理方案
上一篇【第32篇】Netty背压机制——不让发送方“撑死“接收方下一篇【第34篇】 Netty Selector优化——为什么比JDK NIO快这么多开篇故事某物联网平台凌晨3点数据库连接池爆满。排查发现上万个IoT设备网络中断后没有心跳检测连接对象一直未释放TCP没有应用层心跳TCP的KeepAlive默认2小时才检测一次远远不够。一、IdleStateHandler——Netty心跳检测核心// 三种空闲检测pipeline.addLast(newIdleStateHandler(60,// readerIdleTime60秒没读 → 触发读空闲30,// writerIdleTime30秒没写 → 触发写空闲0// allIdleTime0表示不检测));实现原理publicclassIdleStateHandlerextendsChannelDuplexHandler{// 使用时间轮定时任务检测超时privatevoidinitialize(ChannelHandlerContextctx){if(readerIdleTime0){readerIdleTimeoutschedule(ctx,newReaderIdleTimeoutTask(ctx),readerIdleTime,TimeUnit.SECONDS);}}// 每次读/写事件重置定时器publicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){if(readerIdleTime0){readingtrue;}ctx.fireChannelRead(msg);}// 超时后触发userEventTriggeredprotectedvoidchannelIdle(ChannelHandlerContextctx,IdleStateEventevt){ctx.fireUserEventTriggered(evt);}}二、心跳处理HandlerpublicclassHeartbeatHandlerextendsChannelInboundHandlerAdapter{OverridepublicvoiduserEventTriggered(ChannelHandlerContextctx,Objectevt){if(evtinstanceofIdleStateEvent){IdleStateEventevent(IdleStateEvent)evt;switch(event.state()){caseREADER_IDLE:System.out.println(读超时可能客户端已断开);ctx.close();// 关闭死连接break;caseWRITER_IDLE:System.out.println(写超时发送心跳包);ctx.writeAndFlush(newHeartbeatMsg());break;}}}}三、客户端断线重连publicclassReconnectingClient{privatefinalEventLoopGroupgroupnewNioEventLoopGroup();privatefinalBootstrapbootstrap;publicReconnectingClient(){bootstrapnewBootstrap().group(group).channel(NioSocketChannel.class).handler(newChannelInitializerChannel(){protectedvoidinitChannel(Channelch){ch.pipeline().addLast(newIdleStateHandler(0,10,0));ch.pipeline().addLast(newReconnectHandler());}});}publicvoidconnect(){bootstrap.connect(localhost,8080).addListener(f-{if(!f.isSuccess()){// 连接失败延迟重连group.schedule(()-connect(),5,TimeUnit.SECONDS);}});}classReconnectHandlerextendsChannelInboundHandlerAdapter{publicvoidchannelInactive(ChannelHandlerContextctx){System.out.println(连接断开5秒后重连...);ctx.channel().eventLoop().schedule(()-connect(),5,TimeUnit.SECONDS);}}}四、完整实战带心跳的聊天室publicclassHeartbeatChatServer{publicstaticvoidmain(String[]args)throwsException{EventLoopGroupbossnewNioEventLoopGroup(1);EventLoopGroupworkernewNioEventLoopGroup();try{newServerBootstrap().group(boss,worker).channel(NioServerSocketChannel.class).childHandler(newChannelInitializerChannel(){protectedvoidinitChannel(Channelch){ch.pipeline().addLast(newIdleStateHandler(120,0,0),// 2分钟读超时newStringDecoder(),newStringEncoder(),newHeartbeatHandler(),newChatHandler());}}).bind(8080).sync().channel().closeFuture().sync();}finally{boss.shutdownGracefully();worker.shutdownGracefully();}}}五、总结机制配置作用读空闲readerIdleTime检测死连接写空闲writerIdleTime发送心跳保活重连策略指数退避延迟避免重连风暴TCP KeepAlive不依赖间隔太长2小时上一篇【第32篇】Netty背压机制——不让发送方“撑死“接收方下一篇【第34篇】 Netty Selector优化——为什么比JDK NIO快这么多

相关新闻

如何掌握微信聊天记录完整导出方案:开源工具终极指南

如何掌握微信聊天记录完整导出方案:开源工具终极指南

如何掌握微信聊天记录完整导出方案:开源工具终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾担心手机丢失或更换设备时,那些珍贵…

2026/6/21 5:56:14阅读更多 →
国产大模型API调用实践与安全网关建设指南

国产大模型API调用实践与安全网关建设指南

我无法基于“openrouter 260507数据分享”这一标题生成符合要求的博文。 原因如下: 标题无实质项目属性 :“openrouter 260507数据分享”不是一项可复现、可验证、具备明确技术路径或操作闭环的项目。它缺乏主体(谁在分享?&…

2026/6/21 5:56:14阅读更多 →
FOFA实战:从网络空间测绘到漏洞挖掘的完整工作流

FOFA实战:从网络空间测绘到漏洞挖掘的完整工作流

1. 从“搜”到“挖”:一个安全新手的思维跃迁很多刚入门安全的朋友,心里总憋着一股劲儿,想亲手挖到属于自己的第一个漏洞,那种成就感是看一百篇复现文章都换不来的。但现实往往是,学了SQL注入、XSS、文件上传&#xff…

2026/6/21 5:56:14阅读更多 →
R语言数据标准化三大方法:log/min-max/standard scaling实战指南

R语言数据标准化三大方法:log/min-max/standard scaling实战指南

1. 项目概述:R语言数据标准化的三种落地路径,为什么新手总在第一步就卡住?在R语言数据分析的实际工作中,“Normalize data”这个动作远不是调用一个函数那么简单。它直接决定后续建模的稳定性、聚类结果的合理性、甚至热力图颜色分…

2026/6/21 7:16:35阅读更多 →
3步掌握FModel:解锁虚幻引擎游戏资源的完整指南

3步掌握FModel:解锁虚幻引擎游戏资源的完整指南

3步掌握FModel:解锁虚幻引擎游戏资源的完整指南 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel 想要探索你喜爱的虚幻引擎游戏内部资源吗?FModel正是你需要的免费开源工具。这款专…

2026/6/21 7:16:35阅读更多 →
德布鲁因图独立数:渐近公式与精确构造的挑战

德布鲁因图独立数:渐近公式与精确构造的挑战

1. 从一道“反直觉”的题目说起:为什么德布鲁因图的独立数这么难算?几年前,我在一个组合数学的讨论群里,看到有人抛出了这样一个问题:“给定一个参数为(d, n)的德布鲁因图B(d, n),它的最大独立集大小&#…

2026/6/21 7:16:35阅读更多 →
嵌入式GUI文本显示优化:emWin API实战技巧与性能调优

嵌入式GUI文本显示优化:emWin API实战技巧与性能调优

1. 项目概述:为什么嵌入式GUI的文本显示值得深究?在嵌入式系统开发里,给屏幕“写字”和“画数字”听起来是件再基础不过的事。但如果你真这么想,那可能已经踩进了第一个坑。我见过不少项目,初期界面跑得挺欢&#xff0…

2026/6/21 7:16:35阅读更多 →
Gemma 4 12B小显存部署:QAT+MTP实战指南

Gemma 4 12B小显存部署:QAT+MTP实战指南

1. 项目概述:为什么“小显存福音”这四个字值得你停下来看完这篇Gemma 4 12B QAT MTP 本地部署——这个标题里没有一个词是虚的,全是实打实的技术锚点。我从去年底开始在一台仅配备RTX 3060 12GB 显存的台式机上反复打磨这套方案,目标很明确…

2026/6/21 7:16:35阅读更多 →
嵌入式开发链接器配置:从ABI到内存优化的实战指南

嵌入式开发链接器配置:从ABI到内存优化的实战指南

1. 项目概述:嵌入式开发中链接器的核心价值在嵌入式开发这个资源受限的世界里,每一字节的内存和每一个时钟周期都弥足珍贵。我们常常将精力聚焦在算法优化和代码精简上,却容易忽略一个至关重要的幕后功臣——链接器。它远不止是编译流程最后那…

2026/6/21 7:11:35阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/21 0:00:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/21 0:00:40阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/21 0:00:40阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/21 0:00:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/21 0:00:40阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/21 0:00:40阅读更多 →