[Netty] Netty自带的心跳机制 (十五)

这篇具有很好参考价值的文章主要介绍了[Netty] Netty自带的心跳机制 (十五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.IdleStateHandler介绍

Netty服务端心跳机制: IdleStateHandler, 这个类可以对三种类型的心跳检测。

@ChannelHandler.Sharable
public class IdleHandler extends ChannelInboundHandlerAdapter {
    private static final Logger LOG = LoggerFactory.getLogger(IdleHandler.class);

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object paramObject) throws Exception {
        LOG.info("userEventTriggered");
        if (paramObject instanceof IdleStateEvent) {
            IdleState state = ((IdleStateEvent) paramObject).state();
            if (state == IdleState.ALL_IDLE) {
                //关闭连接
                ctx.channel().close();
            }
        } else {
            super.userEventTriggered(ctx, paramObject);
        }


    }
}

IdleHandler继承了ChannelInboundHandlerAdapter, 载了userEventTriggered方法, 执行了关闭连接的逻辑

[Netty] Netty自带的心跳机制 (十五)

2.IdleStateHandler源码解析

[Netty] Netty自带的心跳机制 (十五)

  • readerIdleTime:为读超时时间(即测试端一定时间内未接受到被测试端消息
  • writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)
  • allIdleTime:所有类型的超时时间

[Netty] Netty自带的心跳机制 (十五)

这个类是ChannelHandler, 会被加载如ChannelPipeline。

[Netty] Netty自带的心跳机制 (十五)

让channelPipe中的下一个handler处理channelRead方法。

fireChannelRead用法: fireChannelRead表示传递消息至下一个处理器, 因为Pipeline的原因, 有 一个链式的处理队列, 消息为队列的头处理器进入。

比如如果A, B, C处理器, 如果A处理器没有fireChannelRead方法, 那么B, C不会接受到消息。

[Netty] Netty自带的心跳机制 (十五)

IdleStateHandler的精髓。

    private void initialize(ChannelHandlerContext ctx) {
        // Avoid the case where destroy() is called before scheduling timeouts.
        // See: https://github.com/netty/netty/issues/143
        switch (state) {
        case 1:
        case 2:
            return;
        }

        state = 1;
        initOutputChanged(ctx);

        lastReadTime = lastWriteTime = ticksInNanos();
        if (readerIdleTimeNanos > 0) {
            readerIdleTimeout = schedule(ctx, new ReaderIdleTimeoutTask(ctx),
                    readerIdleTimeNanos, TimeUnit.NANOSECONDS);
        }
        if (writerIdleTimeNanos > 0) {
            writerIdleTimeout = schedule(ctx, new WriterIdleTimeoutTask(ctx),
                    writerIdleTimeNanos, TimeUnit.NANOSECONDS);
        }
        if (allIdleTimeNanos > 0) {
            allIdleTimeout = schedule(ctx, new AllIdleTimeoutTask(ctx),
                    allIdleTimeNanos, TimeUnit.NANOSECONDS);
        }
    }

创建时间间隔为readerIdleTime的定时任务。触发了一个Task, ReaderIdleTimeoutTask。

[Netty] Netty自带的心跳机制 (十五)

[Netty] Netty自带的心跳机制 (十五)

用当前时间减去最后一次channelRead方法调用的时间, 假如这个结果是6s, 说明最后一次调用channelRead已经是6s之前的事情了, 设置为5s, 那么nextDelay为-1, 说明超时了。执行③处代码, 触发channelIdle(), 执行fireUserEventTriggered(), 下一个处理器的userEventTriggered()

[Netty] Netty自带的心跳机制 (十五)

自定义的userEventTriggered方法, 在自带的IdleStateHandler处理器, 在心跳检测超时时, 最终会执行下一个handler的userEventTriggered方法来处理。

3.IdleStateHandler总结

IdleStateHandler这个类会根据你设置的超时参数的类型和值, 循环去检测channelRead和write方法多久没有被调用了, 如果时间超过设置的时间的话, 触发对应的事件, channelRead, channelActive, channelIdle方法文章来源地址https://www.toymoban.com/news/detail-423190.html

  1. 如果超时了, 则会调用userEventTriggered方法, 且会告诉你超时的类型
  2. 如果没有超时, 则会循环定时检测, 除非你将IdleStateHandler移除Pipeline

到了这里,关于[Netty] Netty自带的心跳机制 (十五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】 心跳机制

    应用场景 在长连接下,有可能很长一段时间没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互 的连接给断掉。在这个时候,就需要我们

    2024年02月08日
    浏览(25)
  • websocket 心跳机制

    WebSocket 是一种在客户端和服务器之间创建持久连接的技术。为了保持连接的稳定性,就需要通过发送心跳消息来维持 WebSocket 连接。 1、创建一个webscoket基本的使用 2、在客户端连接到 WebSocket 服务器之后,通过 setInterval 方法定时发送心跳消息 这边的代码会每隔5秒向服务器发

    2024年02月11日
    浏览(26)
  • Eureka中的心跳机制

    前言         从以前的单体架构到现在的微服务分布式架构, 随着架构的演变, 所需要的技术越来越多, 要求的也越来越多了, 今天来谈一下微服务领域中的心跳机制         在微服务领域,心跳机制很常见了, 比如Eureka. Nacos中的客户端和服务端的服务续约, Redis的主从复

    2024年02月16日
    浏览(24)
  • WebSocket断开原因和心跳机制

    WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来。 错误状态码: WebSocket断开时,会触发CloseEvent, CloseEvent会在连接关闭时发送给使用 WebSockets 的客户端. 它在 WebSocket 对象的 onclose 事件监听器中使用。CloseEvent的code字段表示了WebSocket断开的原因。可以从该字段

    2024年02月04日
    浏览(36)
  • uniapp websocket机制 心跳 重连

    在开发程序过程中通信功能还是比较常用到的,本文主要介绍的是uniapp中websocket的使用 websocket建立连接后,断开、心跳机制重新链接的一个过程。 关于uni.connectSocket可仔细阅读uniapp官网中的uni.connetSocket以及连接socket创建的实例 SocketTask   具体代码如下:内有代码详细注解,

    2024年02月12日
    浏览(30)
  • websocket以及心跳机制的实现

            在浏览器与服务器通信之间,传统的http请求在某些场景下并不理想,比如实时聊天,实时性的小游戏等等, 其中面临主要的两个缺点: 无法做到消息的实时性 服务器无法主动推送信息 其基于http的主要解决方案有: 基于ajax的轮询:客户端定时或者动态相隔短时

    2024年02月04日
    浏览(30)
  • WebSocket的心跳机制和断线重连

    在服务器重启或是弱网情况下,前端不能保证一直连接成功。因此在出现被动断开的情况下,需要有 心跳机制 和 断线重连 的功能。 心跳机制 :客户端每隔一段时间向服务端发送一个特有的心跳消息,每次服务端收到消息后只需将消息返回,此时,若二者还保持连接,则客

    2024年01月18日
    浏览(33)
  • WebSocket心跳检测和重连机制

    心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生。 websocket 连接断开有以下两证情况: 前端断开 在使用 websocket 过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时关闭,这时候websocket的连接已经断开,而不同浏览器有不同

    2024年01月21日
    浏览(30)
  • websocket前端封装代码,心跳机制断线重连

    websocket是一种全双工通信长链接,大多用来实现及时通讯,数据实时性要求较为高的地方,在websoket未出现的时候前端使用的setInterval轮训进行数据更新的,在那些对于数据实时性要求不高地方我们仍可以使用 轮训。 (1)建立在 TCP 协议之上,服务器端的实现比较容易。 (

    2024年02月11日
    浏览(40)
  • Flutter:WebSocket封装-实现心跳、重连机制

    前言Permalink Flutter简介 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Nat

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包