nettynetty 心跳包包,只要在服务端设置吗

netty教程(1)
客户端如果长期没有发送数据到服务器就发送心跳包”[LinkTest]”保持连接,如果客户端未收到服务器反馈数据,就发送登录信息”admin”, “admin”,重新登录。
Netty自己给我们提供的特别方便的操作IdleStateHandler
bootstrap.handler(new ChannelInitializer&SocketChannel&() {
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast("ping", new IdleStateHandler(60, 20, 60 * 10, TimeUnit.SECONDS));
socketChannel.pipeline().addLast(new NettyClientHandler());
socketChannel.pipeline().addLast("ping", new IdleStateHandler(60, 20, 60 * 10, TimeUnit.SECONDS));
这个就表示 如果60秒未收到服务器信息 就重新登录
如果20秒没有信息向服务器发送 就发送心跳信息
在你的handler里面重写userEventTriggered
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
// TODO Auto-generated method stub
super.userEventTriggered(ctx, evt)
if (evt instanceof IdleStateEvent) {
IdleStateEvent event = (IdleStateEvent) evt
if (event.state().equals(IdleState.READER_IDLE)) {
Log.logD("------长期未收到服务器反馈数据------")
String loginMsg = Login.login("admin", "admin")
Log.logD("------发送登录信息------" + loginMsg+"\r\n")
ctx.writeAndFlush(getSendByteBuf(loginMsg))
//根据具体的情况 在这里也可以重新连接
} else if (event.state().equals(IdleState.WRITER_IDLE)) {
Log.logD("------长期未向服务器发送数据 发送心跳------")
Log.logD("------发送心跳包------" + "[LinkTest]\r\n")
ctx.writeAndFlush(CodeChange.StringToBuff("[LinkTest]"))
} else if (event.state().equals(IdleState.ALL_IDLE)) {
主要的逻辑就是如果有数据 就向客户端发送数据
没有就发送心跳,服务器长期没有反馈就发送登录信息
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7885次
排名:千里之外
原创:20篇
(3)(3)(3)(14)&>&&>&&>&&>&netty 心跳检测
netty 心跳检测
上传大小:3.25MB
非常简单明了的netty心跳检测代码,标准的eclipse工程代码,导入后即可运行。由于代码很精简,可以轻松学会Netty心跳检测的原理
综合评分:5(1位用户评分)
所需积分:2
下载次数:21
审核通过送C币
创建者:mttsui
创建者:cpongo1
创建者:f_feng3
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
netty 心跳检测
会员到期时间:剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:Netty 超时机制及心跳程序实现
来源:waylau ,
</netty-time-out-and-heartbeat/
如有好文章投稿,请点击 → 这里了解详情
本文介绍了 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; // 所有超时
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
public void userEventTriggered(ChannelHandlerContext ctx, Object evt)
throws Exception {
if (evt instanceof IdleStateEvent) { // 2
IdleStateEvent event = (IdleStateEvent)
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);
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();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new ))
.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
见 /waylau/netty-4-user-guide-demos 中 heartbeat包
Netty 4.x 用户指南 /waylau/netty-4-user-guide
Netty 实战(精髓) /waylau/essential-netty-in-action
看完本文有收获?请转发分享给更多人
关注「ImportNew」,看技术干货
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点饿了么融资6.3亿美元 估值超30亿美元
饿了么融资6.3亿美元 估值超30亿美元 O2O烧钱模式难持续
网络票房乱象:复制线下“偷票房”双系统
本网最新文章本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接。
Netty 超时机制的介绍
Netty 的超时类型 IdleState 主要分为:
ALL_IDLE : 一段时间内没有数据接收或者发送
READER_IDLE : 一段时间内没有数据接收
WRITER_IDLE
本文介绍了 Netty 超时机制的原理,以及如何在连接闲置时发送一个心跳来维持连接。
Netty 超时机制的介绍
Netty 的超时类型
主要分为:
ALL_IDLE : 一段时间内没有数据接收或者发送
READER_IDLE : 一段时间内没有数据接收
WRITER_IDLE : 一段时间内没有数据发送
在 Netty 的
包下,主要类有:
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)
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);
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();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new ))
.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
中 heartbeat包
Netty 4.x 用户指南
Netty 实战(精髓)
本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@ 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】阿里云免费套餐放量周:每天100个免费邀请码,更有坚果pro手机等你来抢&&
是解决用户结构化数据搜索需求的托管服务,支持数据结构、搜索排序、数据处理自由定制。 为您的网站或应用程序提供简单...
阿里云数加提供了大量的大数据产品,包括大数据基础服务、数据分析及展现、数据应用、人工智能等产品与服务。这些产品均...
先知(安全情报)平台提供私密的安全众测服务,可帮助企业全面发现业务漏洞及风险,按效果付费。
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...}

我要回帖

更多关于 netty 心跳检测 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信