原地址:http://www.tuicool.com/articles/m2IRZv
本文介绍了 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<Channel> {
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
效果
源码
见 https://github.com/waylau/netty-4-user-guide-demos 中 heartbeat
包
参考
- Netty 4.x 用户指南 https://github.com/waylau/netty-4-user-guide
- Netty 实战(精髓) https://github.com/waylau/essential-netty-in-action
相关推荐
在本文中,我们将深入探讨如何利用 Netty 和 WebSocket 实现心跳检测和断线重连机制。 首先,我们需要理解 WebSocket 协议。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它为客户端和服务器提供了低...
在本文中,我们将深入探讨 Netty 的断线重连机制和心跳机制,这两个特性对于维持稳定可靠的网络通信至关重要。 首先,让我们了解**断线重连机制**。在分布式系统中,网络连接可能会因为各种原因中断,如网络抖动、...
3. 使用Netty的ChannelHandlerContext发送心跳包,并设置相应的超时检查和处理机制。 4. 如何处理Socket连接,发送和接收自定义协议的数据。 5. 示例代码展示如何在Java中编写和运行Netty应用。 这个demo将是一个很...
在“基于netty_4.0.26的心跳检测”这个主题中,我们将深入探讨如何在Netty 4.0.26版本中实现心跳检测机制,以确保网络连接的稳定性和可靠性。 心跳检测是网络通信中的一个重要概念,主要用于检测客户端与服务器之间...
本篇文章将深入探讨如何在 Netty 中实现心跳机制。 ### 1. Netty 心跳概念 心跳机制在网络通信中扮演着重要角色,它通过定期发送小型数据包或无实际内容的数据包(通常称为"心跳包")来验证连接的活跃性。当连接的...
在IT行业中,Spring Boot和Netty是两个非常重要的框架,Spring Boot简化了Spring应用程序的开发,而Netty则是一个高性能的异步事件驱动的网络应用框架,常用于创建高效的服务器和客户端。当我们需要在分布式系统中...
- **心跳机制**:保持连接活跃,防止因长时间无数据交换导致的连接超时断开。 4. **Netty 与大文件传输** - **零拷贝**:Netty 利用 NIO 的 FileChannel.transferTo 方法,实现了从文件到网络的直接传输,减少了...
在本文中,我们将深入探讨 Netty 实现简单通信和心跳机制的基础知识,这对于初学者来说是一个很好的起点。 一、Netty 框架简介 Netty 是由 JBoss 提供的一个开源框架,基于 Java NIO(非阻塞I/O)构建。Netty 提供...
本项目是基于Spring Boot和Netty框架实现的心跳检测功能,它能够帮助开发者在分布式系统或微服务架构中检测服务是否正常运行,及时发现并处理网络故障。下面将详细解释这个项目涉及的关键知识点。 1. **Spring Boot...
Netty心跳检测的实现往往结合ChannelHandlerContext和ByteBuf对象,利用它们来编码和解码心跳包,同时利用Future和ChannelFutureListener来处理超时和异常情况。 在实际应用中,心跳检测还可以与其他机制相结合,如...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何利用 Netty 实现Socket同步数据获取,同时涵盖心跳检测、客户端连接控制以及...
特别地,手册还介绍了Netty实现聊天功能和WebSocket聊天功能的方法,以及Netty超时机制和心跳程序的实现。这些功能的实现案例,为用户提供了实用的网络通信应用的构建框架。 用户手册中还提到了Netty的另一个重要...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在分布式系统和网络编程中,心跳检测是一个关键功能,它用于确保连接的活跃性和可靠性。本示例将详细介绍...
【Netty 超时机制及心跳程序实现】(1.5.1-1.5.3)讲解了如何处理连接超时和保持连接活跃的心跳机制,这对于长连接服务至关重要。 最后,【Architectural Overview】部分总结了Netty的整体架构,帮助读者从宏观角度...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,常用于开发高并发、低延迟的网络服务,如TCP和UDP应用。在长连接场景下,保持连接的稳定性至关重要,这就涉及到了心跳检测机制。 心跳检测机制是网络通信中...
最后,用户指南中还会介绍Netty的其他高级特性,如实现WebSocket聊天功能,以及Netty超时机制和心跳程序的实现。这些高级特性对于构建复杂的网络应用程序至关重要。 总之,Netty用户指南通过全面的介绍和实例演示,...
在这个“Netty HelloWorld + HeartBeat Demo”中,我们将深入理解Netty的基本用法以及如何实现心跳机制。 首先,让我们从Netty HelloWorld Demo开始。这个Demo通常用于展示如何使用Netty创建一个简单的TCP服务器和...
3. **心跳机制**:为了保持连接活性,需要实现心跳包的发送和接收。可以创建一个专门的心跳 ChannelHandler 来处理心跳相关的逻辑。 4. **异常处理**:定义异常处理器,捕获并处理可能出现的网络异常,如连接断开、...
Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。而WebSocket是一种在单个TCP连接上进行全双工通信的协议,常用于实现服务器主动向客户端推送数据的需求。 ...
5. **心跳维持**: 为了保持NAT映射的有效性,通常需要定期发送心跳包,确保通信通道不被NAT超时关闭。 6. **异常处理**: 设计适当的异常处理机制,例如重试、断线重连等,以增强系统稳定性。 在实际应用中,可能还...