本文介绍了 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

源码

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

java netty swap高_Netty 超时机制及心跳程序实现相关推荐

  1. Netty 超时机制及心跳程序实现

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

  2. java netty 即时通讯_netty百万并发-javanetty如何处理1m连接

    在某些极端的情况下,这些语言中的每一种都不完全相同,所以我使用的Java语言,有100万个并发连接,这有点奇怪,更有希望.nginx 并发 netty并发. 这一次使用了方便的netty NIO框架( ...

  3. java netty聊天室_netty实现消息中心(二)基于netty搭建一个聊天室

    前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...

  4. java netty 日志_Netty日志处理

    ## 9.1.1 Java的日志系统 java领域存在多种日志框架,目前常用的日志框架包括Log4j,Log4j 2,Commons Logging,Slf4j,Logback,Jul.这些框架中可以 ...

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

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

  6. 闭关30天,献上【Java一线大厂高岗面试题解析合集】,冲刺金九银十!

    概述 时间不等人,2022年转眼就要过去大半了,春招在疫情中度过,不知有多少人还在惋惜... 马上又是秋招的高峰"金九银十",估计现在就已经有不少的程序猿(媛)朋友早就踏上提前批之 ...

  7. 闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银十

    前言 时间不等人,2022年转眼就要过去大半了,春招在疫情中度过,不知有多少人还在惋惜... 马上又是秋招的高峰"金九银十",估计现在就已经有不少的程序猿(媛)朋友早就踏上提前批之 ...

  8. 万字长文,冲刺备战金九银十,奉上[Java一线大厂高岗面试题解析合集]

    时间不等人,2022年转眼就要过去大半了,春招在疫情中度过,不知有多少人还在惋惜... 马上又是秋招的高峰"金九银十",估计现在就已经有不少的程序猿(媛)朋友早就踏上提前批之路了吧 ...

  9. Netty 实现高并发通讯原理理解

    1.前言 最近写了很多关于Netty应用级别的文章,针对为什么选择Netty来实现高并发通讯,Netty实现高并发通讯的原理是什么?今天有时间把我对Netty的一些理解做个简单的说明,如有不对欢迎指正 ...

最新文章

  1. matlab模块 python,Matlab 和Python结合使用
  2. 【学习求职必备】百度AI和它的7大AI黑科技
  3. java 中调用docker_如何通过Java程序执行docker命令
  4. php基础教程 第六步 学习数组以及条件判断switch补充
  5. CnCiswumWN
  6. 计算机课有什么作业,计算机组成原理课堂作业
  7. 高德地图——一款功能强大的APP
  8. 互动投影游戏加密狗复制教程!
  9. java cmyk和rgb的转换_CMYK与RGB相互转换(java)
  10. CDBPDB USERS AND PRIVILLEGE
  11. 一个大神的工程(复旦 季同学)16bit RISC cpu
  12. 游戏人物属性如何设计
  13. 惊了!这里竟然有你的生日和银行卡密码?
  14. { content-visibility: auto; contain-intrinsic-size: 1px 5000px;}
  15. 332B. Maximum Absurdity
  16. 2022.8.17 mysql 课后作业
  17. 手机页面出现乱码几种可能
  18. Unity2D游戏开发之保卫萝卜
  19. 揭秘你处理数据的“底层逻辑”,详解公式引擎计算(二)
  20. WordPress 插件开发教程:插件加载顺序、创建插件、add_action与do_action

热门文章

  1. Java EE 8怎么了? (第2部分)
  2. 固执己见的框架(例如Spring Boot)的危险。 求知代码反转
  3. 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次
  4. groovy 2.5.4_Java 7 vs Groovy 2.1性能比较
  5. 执行器的Spring启动和安全性事件
  6. Java和Python中类似Kotlin的生成器,续:附加参数
  7. proxy aspectj_使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍
  8. 使用外星人进行测试:如何使用Arquillian测试JPA类型转换器
  9. Spring Integration Java DSL示例–使用Jms名称空间工厂进一步简化
  10. 从Java连接到Cassandra