本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接。

Netty 超时机制的介绍

Netty 的超时类型 IdleState 主要分为:

ALL_IDLE : 一段时间内没有数据接收或者发送

READER_IDLE : 一段时间内没有数据接收

WRITER_IDLE : 一段时间内没有数据发送

在 Netty 的 timeout 包下,主要类有:

IdleStateEvent : 超时的事件

IdleStateHandler : 超时状态处理

ReadTimeoutHandler : 读超时状态处理

WriteTimeoutHandler : 写超时状态处理

其中 IdleStateHandler 包含了读\写超时状态处理,比如

private static final int READ_IDEL_TIME_OUT = 4; // 读超时

private static final int WRITE_IDEL_TIME_OUT = 5;// 写超时

private static final int ALL_IDEL_TIME_OUT = 7; // 所有超时

new IdleStateHandler(READ_IDEL_TIME_OUT,

WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS));

上述例子,在 IdleStateHandler 中定义了读超时的时间是 4 秒, 写超时的时间是 5 秒,其他所有的超时时间是 7 秒。

应用 IdleStateHandler

既然 IdleStateHandler 包括了读\写超时状态处理,那么很多时候 ReadTimeoutHandler 、 WriteTimeoutHandler 都可以不用使用。定义另一个名为 HeartbeatHandlerInitializer 的 ChannelInitializer :

public class HeartbeatHandlerInitializer extends ChannelInitializer {

private static final int READ_IDEL_TIME_OUT = 4; // 读超时

private static final int WRITE_IDEL_TIME_OUT = 5;// 写超时

private static final int ALL_IDEL_TIME_OUT = 7; // 所有超时

@Override

protected void initChannel(Channel ch) throws Exception {

ChannelPipeline pipeline = ch.pipeline();

pipeline.addLast(new IdleStateHandler(READ_IDEL_TIME_OUT,

WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS)); // 1

pipeline.addLast(new HeartbeatServerHandler()); // 2

}

}

使用了 IdleStateHandler ,分别设置了读、写超时的时间

定义了一个 HeartbeatServerHandler 处理器,用来处理超时时,发送心跳

定义了一个心跳处理器

public class HeartbeatServerHandler extends ChannelInboundHandlerAdapter {

// Return a unreleasable view on the given ByteBuf

// which will just ignore release and retain calls.

private static final ByteBuf HEARTBEAT_SEQUENCE = Unpooled

.unreleasableBuffer(Unpooled.copiedBuffer("Heartbeat",

CharsetUtil.UTF_8));  // 1

@Override

public void userEventTriggered(ChannelHandlerContext ctx, Object evt)

throws Exception {

if (evt instanceof IdleStateEvent) {  // 2

IdleStateEvent event = (IdleStateEvent) evt;

String type = "";

if (event.state() == IdleState.READER_IDLE) {

type = "read idle";

} else if (event.state() == IdleState.WRITER_IDLE) {

type = "write idle";

} else if (event.state() == IdleState.ALL_IDLE) {

type = "all idle";

}

ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate()).addListener(

ChannelFutureListener.CLOSE_ON_FAILURE);  // 3

System.out.println( ctx.channel().remoteAddress()+"超时类型:" + type);

} else {

super.userEventTriggered(ctx, evt);

}

}

}

定义了心跳时,要发送的内容

判断是否是 IdleStateEvent 事件,是则处理

将心跳内容发送给客户端

服务器

服务器代码比较简单,启动后侦听 8082 端口

public final class HeartbeatServer {

static final int PORT = 8082;

public static void main(String[] args) throws Exception {

// Configure the server.

EventLoopGroup bossGroup = new NioEventLoopGroup(1);

EventLoopGroup workerGroup = new NioEventLoopGroup();

try {

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workerGroup)

.channel(NioServerSocketChannel.class)

.option(ChannelOption.SO_BACKLOG, 100)

.handler(new LoggingHandler(LogLevel.INFO))

.childHandler(new HeartbeatHandlerInitializer());

// Start the server.

ChannelFuture f = b.bind(PORT).sync();

// Wait until the server socket is closed.

f.channel().closeFuture().sync();

} finally {

// Shut down all event loops to terminate all threads.

bossGroup.shutdownGracefully();

workerGroup.shutdownGracefully();

}

}

}

客户端测试

客户端用操作系统自带的 Telnet 程序即可:

telnet 127.0.0.1 8082

效果

20151106-heartbeat

源码

见https://github.com/waylau/netty-4-user-guide-demos中 heartbeat包

欢迎留言讨论,加关注,持续更新!

转载于:https://www.cnblogs.com/Ti1077/p/9517850.html

Netty 超时机制及心跳程序实现相关推荐

  1. java netty swap高_Netty 超时机制及心跳程序实现

    本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接. Netty 超时机制的介绍 Netty 的超时类型 IdleState 主要分为: ALL_IDLE : 一段时间 ...

  2. TCPIP协议栈的心跳、丢包重传、连接超时机制实例详解

    目录 1.问题概述 2.TCPIP协议栈的心跳机制 2.1.TCP中的ACK机制 2.2.TCPIP协议栈的心跳机制说明 2.3.修改TCPIP协议栈的默认心跳参数 3.libwebsockets开源 ...

  3. dubbo的超时机制和重试机制

    参考: https://www.cnblogs.com/ASPNET2008/p/7292472.html https://www.tuicool.com/articles/YfA3Ub https: ...

  4. java心跳机制_Java 心跳机制实现 DOM

    心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...

  5. java tcp 心跳机制_java 心跳机制

    心跳机制:就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开. 心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定 ...

  6. 关于Hystrix超时机制和线程状态的测试观察和个人理解

    作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! 我们在使用Hystrix时,大部分情况下都是直接基于SpringCloud的相关注解来完成请求调用的.我们有个项 ...

  7. golang net/http 超时机制完全手册

    目录 SetDeadline 服务器端超时设置 客户端超时设置 Cancel 和 Context 英文原始出处: The complete guide to Go net/http timeouts, ...

  8. .Net Cancellable Task - APM异步超时机制扩展

    概述 .NET基于委托的APM(Asynchronous Programming Model)模式通过BeginInvoke, EndInvoke, AsyncCallback,IAsyncResul ...

  9. golang mysql 超时_Go语言channel超时机制

    Go语言没有提供直接的超时处理机制,所谓超时可以理解为当我们上网浏览一些网站时,如果一段时间之后不作操作,就需要重新登录. 那么我们应该如何实现这一功能呢,这时就可以使用 select 来设置超时. ...

最新文章

  1. 桌面的html文件怎么打开方式,html文件怎么打开
  2. nginx小总结(五)
  3. fastjson反序列化漏洞_漏洞预警Fastjson再爆反序列化代码执行漏洞;星巴克被发现存在信息泄露风险...
  4. 初学者linux和ubuntu,linux初学者也必须知道的几个ubuntu最基础命令
  5. SAP云平台CloudFoundry上部署应用的log分析
  6. 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件
  7. linux 内存管理优化,Linux性能优化实战 内存篇 阅读笔记
  8. python实现文件传输_Python使用socket实现简单的文件传输并校验
  9. webpack插件实现自动抽取css中的主题色样式,并动态切换主题色(element-ui)
  10. LINQ的数据库查询应用(zhuan)
  11. Linux——CentOS7安装gcc编译器详解
  12. javascript typeof 和 instanceof 的区别和联系
  13. Ubuntu:火狐浏览器加速下载(Flashgot+Aria2+Uget)
  14. vscode误删文件恢复
  15. drhf赫夫生医的产品质量怎么样?
  16. 如何进行 Linux 服务器安全维护
  17. Ubuntu18.04安装搜狗拼音输入法皮肤透明解决方法
  18. SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务
  19. 为什么说Java匿名内部类是残缺的闭包
  20. [Practical.Vim(2012.9)].Drew.Neil.Tip04 学习摘要

热门文章

  1. 大疆激光雷达livox avia 在ubuntu18.04+ROS中基本使用方法
  2. 麻将番型计算(二人麻将)
  3. duplicate symbol _OBJC_CLASS 错误处理方法
  4. 利用FME创建3D模型之从Excel到3D
  5. SETUP FACTORY安装完成后自动运行软件
  6. appium调用了click函数的无反应
  7. win11无法打开.bat文件、打开.bat文件闪退解决方案,星露谷smapi mod安装时,.bat安装文件一闪而过
  8. Web:移动商城首页的页眉和页脚的布局和flex项目三个属性
  9. 销毁一颗二叉树--Destroy(Node* root)
  10. (开源免费)Python-Gui/PyQt-PySide精美动态登录模板