Netty 心跳机制示例 —— 服务端实现

Netty 心跳机制示例 —— 服务端实现

1. 背景

在分布式系统和网络通信中,保持客户端与服务器端的连接活跃是非常重要的。如果长时间没有数据传输,连接可能会超时或被中断。为了解决这个问题,我们可以通过 心跳机制 来保证连接持续有效。

Netty 提供了强大的 IdleStateHandler 来实现心跳机制,它可以根据连接的空闲时间来主动检查连接状态,保证连接的健康。

2. 心跳机制介绍

在 Netty 中,心跳机制的核心组件是 IdleStateHandler,它会监测连接的读空闲(READ_IDLE)、写空闲(WRITE_IDLE)和读写空闲(ALL_IDLE)状态。当触发这些空闲状态时,Netty 会生成一个 IdleStateEvent 事件,并交由相应的处理器来处理(通常是发送心跳包或关闭连接等)。

3. 代码结构
1) 服务端实现
package netty.heartBeat;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.IdleStateHandler;

import java.util.concurrent.TimeUnit;

public class MyServer {
    public static void main(String[] args) {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup,workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .handler(new LoggingHandler(LogLevel.INFO)) // 添加日志处理器
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();

                            /**
                             * IdleStateHandler 是 Netty 提供的用于处理空闲状态的处理器
                             * 1. 多长时间没有读,会发送一个心跳检测包
                             * 2. 多长时间没有写,会发送一个心跳检测包
                             * 3. 多长时间没有读写,会发送一个心跳检测包
                             * IdleStateEvent 触发后会传递给下一个 handler 的 userEventTriggered 来处理
                             */
                            pipeline.addLast(new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS)); // 配置空闲状态检测
                            pipeline.addLast(new MyServerHandler()); // 自定义处理器
                        }
                    });

            ChannelFuture sync = bootstrap.bind(7001).sync(); // 启动服务器并绑定端口
            sync.channel().closeFuture().sync(); // 等待关闭事件

        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

主要功能:

  • 通过 ServerBootstrap 启动服务器并配置事件循环组(bossGroup 和 workerGroup)。

  • childHandler
    

    中配置了

    IdleStateHandler
    

    ,用于监测空闲状态。

    • IdleStateHandler(3, 5, 7, TimeUnit.SECONDS):表示 3 秒无读事件,5 秒无写事件,7 秒无读写事件,分别触发空闲事件。
  • 添加了自定义的 MyServerHandler,用于处理空闲状态事件。

2) 事件处理器
package netty.heartBeat;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;


public class MyServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {

        if (evt instanceof IdleStateEvent) {
            // 将 evt 转型为 IdleStateEvent
            IdleStateEvent event = (IdleStateEvent) evt;
            String eventType = null;

            // 判断空闲状态类型
            switch (event.state()) {
                case READER_IDLE:
                    eventType = "读空闲";
                    break;
                case WRITER_IDLE:
                    eventType = "写空闲";
                    break;
                case ALL_IDLE:
                    eventType = "读写空闲";
                    break;
            }

            System.out.println(ctx.channel().remoteAddress() + "-- 超时时间发送 " + eventType);
            System.out.println("server do sth to solve");
        }
    }
}

主要功能:

  • MyServerHandler 继承自 ChannelInboundHandlerAdapter,重写 userEventTriggered 方法,用于处理 IdleStateEvent
  • 根据空闲状态(读空闲、写空闲、读写空闲)打印不同的日志信息,表示客户端连接处于哪种空闲状态。
4. 核心组件解析
  1. IdleStateHandler:Netty 提供的专门处理空闲状态的处理器。它会定期检查连接的空闲状态,并触发 IdleStateEvent 事件。IdleStateEvent 事件包含三个状态:
    • READER_IDLE:读空闲状态(长时间没有读取数据)。
    • WRITER_IDLE:写空闲状态(长时间没有写入数据)。
    • ALL_IDLE:读写空闲状态(长时间没有读写数据)。
  2. ChannelHandlerContext:表示一个通道的上下文对象,包含了通道的相关信息,并可以用于触发事件或写入数据。
  3. ChannelPipeline:用于存储和管理多个 ChannelHandler,执行链式调用。每个 ChannelHandler 负责处理不同类型的事件。
  4. ChannelInboundHandlerAdapterChannelInboundHandlerAdapter 是 Netty 提供的一个适配器类,允许你只重写需要的处理方法。我们继承此类并重写 userEventTriggered 方法来处理 IdleStateEvent
5. 心跳机制的工作流程
  1. 客户端和服务器建立连接。
  2. 服务器端通过 IdleStateHandler 配置空闲时间检测。
  3. 当连接空闲超过设置的时间限制时,IdleStateHandler 会触发 IdleStateEvent
  4. MyServerHandler 处理该事件,根据不同的空闲状态打印日志或执行其他操作(如发送心跳包)。
  5. 服务器保持与客户端的活跃连接,避免因空闲超时断开连接。
6.结果

image-20241206145909483

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】 进程池 一主多从 管道通信

目录 1.代码介绍 2.channel 类 3.进程池类编写 4.主函数及其他 5. 源码 1.代码介绍 本文代码采用一主多从式&#xff08;一个主进程&#xff08;master&#xff09;多个子进程&#xff08;worker&#xff09;&#xff09;通过管道进行通信&#xff0c;实现主进程分发任务&…

小红薯最新x-s 算法补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置&#xff0c;本篇文章就直接开始撸代码吧 如果没看过的话可以看&#xff1a;小红薯最新x-s算法分析12-06&#xff08;x-s 56&#xff09;&#xff08;上&#xff09;-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…

Nacos源码学习-本地环境搭建

本文主要记录如何在本地搭建Nacos调试环境来进一步学习其源码&#xff0c;如果你也刚好刷到这篇文章&#xff0c;希望对你有所帮助。 1、本地环境准备 Maven: 3.5.4 Java: 1.8 开发工具&#xff1a;idea 版本控制工具: git 2、下载源码 官方仓库地址 &#xff1a;https://git…

视频码率到底是什么?详细说明

视频码率&#xff08;Video Bitrate&#xff09;是指在单位时间内&#xff08;通常是每秒&#xff09;传输或处理的视频数据量&#xff0c;用比特&#xff08;bit&#xff09;表示。它通常用来衡量视频文件的压缩程度和质量&#xff0c;码率越高&#xff0c;视频质量越好&#…

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…

【AI系统】感知量化训练 QAT

感知量化训练 QAT 本文将会介绍感知量化训练&#xff08;QAT&#xff09;流程&#xff0c;这是一种在训练期间模拟量化操作的方法&#xff0c;用于减少将神经网络模型从 FP32 精度量化到 INT8 时的精度损失。QAT 通过在模型中插入伪量化节点&#xff08;FakeQuant&#xff09;…

【AI系统】模型压缩基本介绍

基本介绍 随着神经网络模型的复杂性和规模不断增加&#xff0c;模型对存储空间和计算资源的需求越来越多&#xff0c;使得部署和运行成本显著上升。模型压缩的目标是通过减少模型的存储空间、减少计算量或提高模型的计算效率&#xff0c;从而在保持模型性能的同时&#xff0c;…

使用GO--Swagger生成文档

概述 在前后端分离的项目中&#xff0c;后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包&#xff0c;用于处理Swagger 2.0&#xff08;即OpenAPI 2.0&#xff09;规范。它提供了丰富的工具集&#x…

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后&#xff0c;响应较慢&#xff0c;通用的问题排查方法: 从多个角度来排查问题 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评…

2024年认证杯SPSSPRO杯数学建模C题(第一阶段)云中的海盐解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现&#xff1a; 巴黎气候协定提出的目标是&#xff1a;在2100年前&#xff0c;把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平&#xff0c;并为1.5摄氏度而努力。但事实上&#xff0c;许多之前的…

oracle之用户的相关操作

&#xff08;1&#xff09;创建用户(sys用户下操作) 简单创建用户如下&#xff1a; CREATE USER username IDENTIFIED BY password; 如果需要自定义更多的信息&#xff0c;如用户使用的表空间等&#xff0c;可以使用如下&#xff1a; CREATE USER mall IDENTIFIED BY 12345…

ArcMap 处理河道坡度、计算污染区、三维爆炸功能

ArcMap 处理河道坡度、计算污染区、三维爆炸功能今天分析 一、计算河道方向坡度 1、折线转栅格 确定 2、提取河道高程值 确定后展示河流的高程值 3、计算坡向数据 确定后展示 4、计算坡度数据 确定后展示 二、计算上游集水区污染值 1、填挖处理 确定 2、计算流向 确定 3、计算…

一睹:微软最新发布的LazyGraphRAG

微软近期推出了一项革新性的技术——LazyGraphRAG&#xff0c;这是一种启用图谱的检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;技术&#xff0c;它以其卓越的效率和成本效益&#xff0c;彻底颠覆了传统观念中对“懒惰”的刻板印象。 位…

linux_kernel_编程

内核报错信息查看 include/uapi/asm-generic/errno-base.h 设备树的读取操作 struct device_node *ncof_property_read_bool(nc, "spi-cpha")if (!of_node_name_eq(nc, "slave"))rc of_property_read_u32(nc, "reg", &…

arm64 UOS平台docker配置gitlab

arm64 UOS平台docker配置gitlab 加载或下载gitlab docker镜像配置 加载或下载gitlab docker镜像 docker load < gitlab.tar docker tag xxx gitlab_arm 配置 创建gitlab目录&#xff0c;在gitlab目录下创建etc log opt 目录创建启动文件start_gitlab.sh并增加执行权限 d…

【Homework】【8】Learning resources for DQ Robotics in MATLAB

作业任务 创建一个名为“VS050RobotDH”的类&#xff0c;该类代表Denso VS050机器人&#xff0c;其DH参数如下表所示&#xff0c;并且完全由旋转关节组成。&#xff08;请记住第6课的内容&#xff09; θ \theta θ d d d a a a α \alpha α − π -\pi −π0.3450 π 2 \fra…

Cannot resolve symbol ‘ActivityThread‘ | Android 语法

背景 ActivityThread 是 Android 系统内部使用的一个类,它位于 android.app 包中,但在 Android SDK 的公共 API 中并没有公开。 由于 ActivityThread 是隐藏的内部类,因此在编写单元测试或功能开发时,无法直接引用它。可以使用反射来访问内部 API,或者使用依赖注入的方式…

TSWIKI知识库软件

TSWIKI 知识库软件介绍 推荐一个适合本地化部署、自托管的知识库软件 TSWIKI介绍 tswiki 是一个适合小团队、个人的知识库、资料管理的软件&#xff0c;所有数据均本地化存储。可以本地化、私有云部署&#xff0c;安装简单。在线预览。 主要功能说明 1、简化的软件依赖和安…

Agent AI: Surveying the Horizons of Multimodal Interaction---医疗保健、视频音频、多模态

医疗保健领域 在医疗保健领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;可以作为诊断代理、患者护理助手&#xff0c;甚至是辅助治疗工具&#xff0c;但它们也伴随着独特的挑战和责任。AI代理在提高患者护理质量和拯救生…

Ajax:回忆与节点

一点回忆 面对我的Ajax学习&#xff0c;实现前后端交互&#xff0c;最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法&#xff0c;然后最终成功&#xff0c;然后按照相关教程配置java ee项目&#xff0c;然后中间又去配置了Tomcat服务器&#xff0c;然后又去学习了一…