Netty 心跳检测

本文介绍了Netty的心跳检测机制,通过创建IdleStateHandler来设置读空闲、写空闲和读写空闲的时间,并在触发事件后,由HeartbeatServerHandler处理。示例代码展示了如何配置和实现服务器端的心跳检测,以确保连接的活跃性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

心跳检测

Netty心跳检测机制例如

  • 服务器超过 n 秒没有读取数据时发出读空闲
  • 服务器超过 n 秒没有写数据发出写空闲

使用方式

引入 Netty 提供的 handler io.netty.handler.timeout.IdleStateHandler#IdleStateHandler(long, long, long, java.util.concurrent.TimeUnit)

  • {@link IdleStateHandler} Netty 提供的处理空闲状态的处理器
  • readerIdleTime 读空闲 {多长时间没有读就会发送一个心跳检测包,检查是否链接}
  • writerIdleTime 写空闲 {多长时间没有写就会发送一个心跳检测包,检查是否链接}
  • allIdleTime 读写空闲 {多长时间既没有读也没有写就会发送一个心跳检测包,检查是否链接}
  • idle handler trigger 以后就会把结果传递给下一个 handler 处理
pipeline.addLast("IdleHandler", new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS));
pipeline.addLast("UserIdleHandler", new HeartbeatServerHandler());

HeartbeatServerHandler 的实现

/**
 * 这个处理器会处理 {@link IdleStateHandler} 这个心跳检测传递来的数据
 *
 * @author L
 */
public class HeartbeatServerHandler extends ChannelInboundHandlerAdapter {

    Logger log = LoggerUtils.getLogger(HeartbeatServerHandler.class);

    /**
     * 事件触发
     *
     * @param ctx 上下文信息
     * @param evt 触发的事件
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
        if (evt instanceof IdleStateEvent) {
            // 向下转型
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;

            switch (idleStateEvent.state()) {
                case ALL_IDLE:
                    log.info("读写空闲");
                    break;
                case READER_IDLE:
                    log.info("读空闲");
                    break;
                case WRITER_IDLE:
                    log.info("写空闲");
                    break;
            }
        }
    }
}

这就是一个简单的 Netty 心跳检测小 demo 实列

完整代码

服务端

package com.netty.heartbeat;

import com.utils.LoggerUtils;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
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 org.slf4j.Logger;

import java.util.concurrent.TimeUnit;

/**
 * @author L
 */
public class HeartbeatServer {

    Logger log = LoggerUtils.getLogger(HeartbeatServer.class);

    public void init() throws InterruptedException {

        EventLoopGroup boosGroup = new NioEventLoopGroup();
        EventLoopGroup workGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.channel(NioServerSocketChannel.class)
                    .group(boosGroup, workGroup)
                    // 添加一个处理器 (日志处理器)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    // work 工作的处理器
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ChannelPipeline pipeline = ch.pipeline();
                            // {@link IdleStateHandler} netty 提供的处理空闲状态的处理器
                            // readerIdleTime 读空闲 {多长时间没有读就会发送一个心跳检测包,检查是否链接}
                            // writerIdleTime 写空闲 {多长时间没有写就会发送一个心跳检测包,检查是否链接}
                            // allIdleTime 读写空闲 {多长时间既没有读也没有写就会发送一个心跳检测包,检查是否链接}
                            // idle handler trigger 以后就会把结果传递给下一个 handler 处理
                            pipeline.addLast("", new IdleStateHandler(3, 5, 7, TimeUnit.SECONDS));
                            pipeline.addLast("UserIdleHandler", new HeartbeatServerHandler());
                        }
                    });

            ChannelFuture channelFuture = bootstrap.bind(6666).sync();
            // 添加监听器
            channelFuture.addListener(future -> {
                if (future.isDone()) log.info("服务器绑定端口成功");
            });
            channelFuture.channel().closeFuture().sync();
        } finally {
            boosGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值