netty实现心跳检测
检测逻辑:
1) 服务端启动,客户端建立连接,连接的目的是互相发送消息。
2) 如果客户端在工作,服务端一定能收到数据,如果客户端空闲,服务端会出现资源浪费。
3) 服务端需要一种检测机制,验证客户端的活跃状态,不活跃则关闭。
需求设计:
1) 客户端向服务端发送 “I am alive” , sleep一个随机时间,模拟空闲状态
2) 服务端收到消息后,返回“over”, 客户端有空闲,记录空闲次数
3) 设定阈值,达到阈值时主动关闭连接

服务端编写
public class HreatBeatServer {
public static void main(String[] args) {
//创建两个Reactor 构建主从 Reactor 模型
//用于处理 连接和读写事件 , 无限循环组(线程池)
//管理 channel 监听事件
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
// 我们需要一个服务端引导程序来开启服务端。
ServerBootstrap serverBootstrap = new ServerBootstrap();
//将主从 Reactor 入参,设置当前参数
//这个方法返回的事对象本身,我们可以点出其他方法, 这种返回类型为对象自身 提供了 链式编程的方式
serverBootstrap.group(bossGroup, workerGroup)
//我们需要设置 channel 的 类型
//对应的是 netty NIO BIO
//NioServerSocketChannel <== ServerSocketChannel <== ServerSocket
.channel(NioServerSocketChannel.class)
//设置当前通道的处理器,使用Netty提供的日志打印处理器
.handler(new LoggingHandler(LogLevel.INFO))
//定义客户端连接处理的使用
//此方法需要设置参数 ChannelInitializer 通道初始化器
//初始化 要处理客户端 通道, 所以泛型设置为 SocketChannel
//此类 为抽象类 需要实现其抽象方法 initchannel (alt+enter)快捷键
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//通过channel 获取管道 pipeline
// 通道代表我们连接的角色, 管道代表处理业务得逻辑管理
// 管道相当于 链表,可以将不同的处理器连接起来,管理处理器的顺序
// 使用时 常常使用的事尾插法, addList 将加入到尾部
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());</

该博客介绍了如何使用Netty框架在服务端和客户端实现心跳检测机制。服务端通过IdleStateHandler检测客户端的活跃状态,当空闲次数超过预设阈值时关闭连接。客户端则模拟空闲状态并通过发送Iamalive保持连接。心跳检测有助于在长连接中检测并处理无效或空闲的客户端连接。
最低0.47元/天 解锁文章
588

被折叠的 条评论
为什么被折叠?



