当前位置: 首页 > news >正文

Netty服务器监听读写超时

跟客户端监听连接断开时的处理一样,既添加Netty内置的处理,同时也需要添加自定义处理器。

先来看Netty内置的处理。

ChannelPipeline pipeline = channel.pipeline();
//添加Netty内置的空闲状态检测Handler,60秒没有读写,则触发超时事件
pipeline.addLast(new IdleStateHandler(60, 60, 60, TimeUnit.SECONDS));

上面代码添加了一个Netty内置的处理器:IdleStateHandler

IdleStateHandler 的构造函数有4个参数:

public IdleStateHandler(long readerIdleTime,    // 读空闲时间long writerIdleTime,    // 写空闲时间  long allIdleTime,       // 所有类型空闲时间TimeUnit unit          // 时间单位
)

上面的配置实现:

  • readerIdleTime = 60: 60秒没有读取操作触发读空闲

  • writerIdleTime = 60: 60秒没有写入操作触发写空闲

  • allIdleTime = 60: 60秒既没有读也没有写操作触发全部空闲

  • TimeUnit.SECONDS: 时间单位为秒

工作机制

1. 检测原理

  • Netty会为每个Channel启动定时任务

  • 定期检查最后一次读写操作的时间

  • 如果超过设定时间没有相应操作,就触发对应事件

2. 事件触发

当超时发生时,会触发 userEventTriggered 事件,userEventTriggered 在下面自定义服务器心跳检测处理器会有说明。

由于IdleStateHandler的职责仅仅负责检测空闲状态,不处理具体业务逻辑,因此我们需要定义一个自定义的处理器,用于接收空闲事件并执行具体的业务处理逻辑。

下面创建一个服务器心跳检测处理器

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;/*** @author: * @Desc:服务器端心跳包处理器* @create: 2025-10-03 11:24**/
@Slf4j
public class MyServerHeartBeatHandler extends ChannelInboundHandlerAdapter {// 心跳包处理@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent event = (IdleStateEvent) evt;IdleState state = event.state();switch (state) {case READER_IDLE:log.info("客户端长时间没有发送数据,关闭连接");ctx.close();break;case WRITER_IDLE:log.info("客户端长时间没有写数据,发送心跳包");ctx.writeAndFlush("heartbeat");break;case ALL_IDLE:log.info("客户端长时间没有任何活动,关闭连接");ctx.close();break;default:break;}}super.userEventTriggered(ctx, evt);}
}

最后在Netty服务器添加该处理器。

http://www.dtcms.com/a/437950.html

相关文章:

  • PHP 中的正则表达式
  • Linux的Socket编程之UDP
  • 环境没有tomcat怎么演示自己做的网站动漫设计专业就业方向
  • 180课时吃透Go语言游戏后端开发7:Go语言中的函数
  • Python核心架构深度解析:从解释器原理到GIL机制全面剖析
  • 数据结构_哈夫曼编码(Huffman)完整指南:从原理到实现,附考研真题详解
  • 怎样做网站吸引客户网站开发专业就业前系军
  • 四川建站模板网站公司有哪些做任务网站
  • 藏语自然语言处理入门 - 5 文本归类
  • Stanford CS336 assignment1 | Transformer Language Model Architecture
  • 告别人工出题!PromptCoT 2.0 让大模型自己造训练难题,7B 模型仅用合成数据碾压人工数据集效果!
  • Prompt Programming - 用文字重构AI智能体系
  • 基于提示学习的多模态情感分析系统:从MULT到PromptModel的华丽升级
  • Node.js 图形渲染库对比:node-canvas 与 @napi-rs/canvas
  • 【LangChain】P10 LangChain 提示词模板深度解析(一):Prompt Template
  • C# TCP 服务端开发笔记(TcpListener/TcpClient)
  • 180课时吃透Go语言游戏后端开发6:Go语言的循环语句
  • wordpress+vps建站关键词语有哪些
  • 网站建设基本标准野花高清中文免费观看视频
  • hadoop-hdfs
  • VB6.0找不到该引用word,excel“Microsoft Excel 16.0 Object Library”解决方法
  • 读者-写者问题实现真正的写优先
  • 北京人力资源网站县区网站集约化建设
  • 从零开始,用WPS和DeepSeek打造数字人科普视频
  • netgear r6220 路由器,刷openwrt后,系统备份还原
  • 特价流量网站什么情况自己建设网站
  • 昂瑞微IPO前瞻:技术破局高端射频模组,国产替代第二波浪潮下的硬科技突围
  • 开源 全平台 哔哩哔哩缓存视频合并 Github地址:https://github.com/molihuan/hlbmerge_flutter
  • EPOLLONESHOT事件类型:多线程I/O中的“一次触发“机制
  • Github卡顿问题解决方案