Netty之心跳检测技术(四)

Netty之心跳检测技术(四)

一.简介

  "心跳"听起来感觉很牛X的样子,其实只是一种检测端到端连接状态的技术。举个简单的"栗子",现有A、B两端已经互相连接,但是他们之间很长时间没有数据交互,那么A与B如何判断这个连接是否可用呢?我们通常的做法就是,让任何一方,例如我们让A端,定时的发送(例如每5秒钟)一句问候"Are you ok?",如果B都到来自A的问候,回了一句"GUN",A收到了来自B的信息,也不在乎B到底给我回了什么,即可以断定与B的连接并没有断开;如果没有收到来自B的任何回复,过段时间在去发送问候,那么我们通常认为连续3次问候,都没有收到来自B的恢复,即认为A与B之间的连接已经断开。那么就得尝试着重新获取一个新的连接。

  那么Netty作为一个网络应用框架,肯定对这种心跳提供了响应的处理。那我们上代码吧。

二.心跳的实现

2.1 服务端启动程序

public class MyServer {
    public static void main(String[] args) throws Exception {
        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))   //handler()方法主要是针对bossGroup的处理
                     .childHandler(new ServerInitializer());  //childHandler()主要是针对workerGroup的处理

            ChannelFuture channelFuture = bootstrap.bind(8989).sync();
            channelFuture.channel().closeFuture().sync();
        }finally{
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

2.2服务端通道初始化

public class ServerInitializer extends ChannelInitializer<SocketChannel>{

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        /**
         * IdleStateHandler: 空闲状态处理器。
         * 四个参数:1.读空闲; 2.写空闲;3.读写空闲; 4.时间单位。
         * 所谓的空闲是指多长时间没有发生过对应的时间,就触发调用.
         */
        pipeline.addLast(new IdleStateHandler(5, 7, 3, TimeUnit.SECONDS));
        pipeline.addLast(new ServerHandler());
    }
}

2.3服务端Handler

public class ServerHandler extends ChannelInboundHandlerAdapter{

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if(evt instanceof IdleStateEvent){
            IdleStateEvent event = (IdleStateEvent)evt;

            String idleType = null;
            switch(event.state()){
                case READER_IDLE:
                    idleType = "读空闲";
                    break;
                case WRITER_IDLE:
                    idleType = "写空闲";
                    break;
                case ALL_IDLE:
                    idleType = "读写空闲";
                    break;
            }

            System.out.println(ctx.channel().remoteAddress() + " " + idleType);

            ctx.channel().close();
        }
    }
}

2.4 测试

运行服务端启动程序,然后再启动上一章 《Netty之多用户的聊天室(三)》中的客户端程序,进行测试。

时间: 2025-01-02 06:55:21

Netty之心跳检测技术(四)的相关文章

使用netty开发心跳检测和重连机制的规划与设计

心跳检测 代码逻辑与设计思路 方案1 1.1心跳机制 通过ping-pong双向心跳机制 可以保证无论通信哪一方出现网络故障,都能被及时检测出来 为了防止由于对方短时间内繁忙没有及时返回应答造成的误判,只有连续N次心跳检测都失败才认定链路已经损害,需要关闭链路并重建链路.当读或者写心跳消息发生I/O异常的时候,说明链路已经中断,此时需要立即关闭链路,如果是客户端,需要重新发起连接.如果是服务端,需要重新发起连接.如果是服务端,需要清空缓存的半包信息,等待客户端重连. 1.2重连机制 如果链路中断

Netty实践(四):心跳检测实现

心跳检测的概念 在分布式架构中,比如Hadoop集群,Storm集群等,或多或少都涉及到Master/Slave的概念,往往是一个或者多个Master和N个Slave之间进行通信.那么通常Master应该需要知道Slave的状态,Slave会定时的向Master进行发送消息,相当于告知Master:"我还活着,我现在在做什么,什么进度,我的CPU/内存情况如何"等,这就是所谓的心跳.Master根据Slave的心跳,进行协调,比如Slave的CPU/内存消耗很大,那么Master可以将

Netty实现服务端客户端长连接通讯及心跳检测

通过netty实现服务端与客户端的长连接通讯,及心跳检测.        基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断.         环境JDK1.8 和netty5      

通过netty实现服务端与客户端的长连接通讯,及心跳检测。

基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断. 环境JDK1.8 和netty5 以下是具体的代码实现和介绍: 1公共的Share部分(主要包含消息协议类型的定义) 设计消息类型:

netty心跳检测 heartbeat(五)

HeartBeat心跳 心跳检测的必要性  1.集群心跳检测,避免网络中断 2.数据同步:主节点写日志,从节点每隔一段时间拉取主节点日志. 心跳检测存在的意义: 客户端和服务端已经建立了长连接,客户端开飞行模式,关机,关闭wifi,服务端不会(感知)收到通知(handRemoved)并关闭连接. 核心事件 : ChannelInboundHandlerAdapter类的userEventTriggered事件 心跳检测服务端代码 : server启动类 : 1 public class Hear

Swoole 实例四(心跳检测)

服务器端 server.php <?php /* Swoole已经内置了心跳检测功能,能自动close掉长时间没有数据来往的连接. 而开启心跳检测功能,只需要设置heartbeat_check_interval和heartbeat_idle_time即可.如下: $this->serv->set(     array(         'heartbeat_check_interval' => 60,         'heartbeat_idle_time' => 600,

入侵检测技术考点

第一章.入侵检测概述 入侵检测定义:入侵是指在非授权得情况下,试图存取信息.处理信息或破坏以使系统不可靠.不可用的故意行为. 入侵检测的基本原理:主要分为四个阶段: 1.      数据收集:数据收集是入侵检测的基础,采用不同的方法进行分析. 2.      数据处理:从原始数据中除去冗余.杂声,并且进行格式化以及标准化处理. 3.      数据分析:检查数据是否正常,或者显示是否存在入侵. 4.      响应处理:发现入侵,采取措施进行保护,保留入侵证据并且通知管理员. 1.4 入侵检测的

基于离散余弦变换的同图复制的检测技术

本文是一则学习小结 图像篡改的背景及意义 ??目前图像已经成为人类社会中必不可少的一部分,人们的日常生活中到处都可以见到图像.特别在医学.商业.军事.情报.学术研究.法律和新闻领域中,图像作为原始事件或现象的真实记录,具有信息载体和数字证明的作用.然而人们渐渐发现图像的真实性已经不再可靠了.篡改图像出现的频率越来越大,要分辨出它们也越来越困难. 已知检测技术 数字水印 易损水印,半易损水印和鲁棒水印 水印在图像篡改之前存在 要求所有设备都带有水印装置是不可能的 盲检测技术 不依赖数字水印,是基于

windows cluster 心跳检测阀值优化

通过cmd命令Cluster.exe /prop查看当前群集的属性信息,其中心跳阀值相关属性: SameSubnetDelay:同一子网中的节点的测信号频率 SameSubnetThreshold: 同一子网中的节点的延迟的阈值 CrossSubnetDelay: 不同的子网中的节点的检测信号频率 CrossSubnetThreshold: 在不同的子网中的节点的延迟的阈值 SameSubnetDelay 默认代表每1秒执行一次Windows群集心跳检测,SameSubnetThreshold