Netty--心跳
1 學習IdleStateHandler用來檢測會話狀態。
對於服務端,可以定時清除閒置會話。
對於客戶端來說,檢測會話是否斷開,是否重連,用來檢測網路延遲。
Netty3,觸發的是handleUpstream方法:
// 設定管道工廠
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
//設定下線時間。第二個引數規定指定的秒數內沒有讀操作時將觸發事件,第三個引數規定指定的秒數內沒有寫操作時將觸發事件,
//均會觸發ServerHandler-》中的handleUpstream
pipeline.addLast("idle", new IdleStateHandler(hashedWheelTimer, 5, 5, 10));
// 在此處設定後在messageReceived中將不需要轉換
pipeline.addLast("decoder", new StringDecoder());
// 傳送資料時不需要轉換
pipeline.addLast("encoder", new StringEncoder());
// 業務處理物件
pipeline.addLast("helloHandler", new ServerHandler());
return pipeline;
}
});
public class ServerHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
System.out.println(e.getMessage());
}
@Override
public void handleUpstream(final ChannelHandlerContext ctx, ChannelEvent e)
throws Exception {
if (e instanceof IdleStateEvent) {
if(((IdleStateEvent)e).getState()==IdleState.ALL_IDLE){
//關閉會話,替玩家下線
ChannelFuture write=ctx.getChannel().write("time out,you will close");
write.addListener(new ChannelFutureListener() {
/**
* IO操作執行完回撥
*/
public void operationComplete(ChannelFuture future) throws Exception {
// TODO Auto-generated method stub
ctx.getChannel().close();
}
});
System.out.println("替玩家下線。。。");
ctx.getChannel().close();
}
IdleStateEvent event = (IdleStateEvent) e;
System.out.println(event.getState()+" ");
} else {
super.handleUpstream(ctx, e);
}
}
}
Netty5,觸發的是userEventTriggered方法:
// 設定管道工廠
bootstrap.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new IdleStateHandler(5, 5, 10));
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new ServerHandler());
}
});
觸發的事件
/**
* 服務端訊息處理
*
* @author Tang
*
*/
public class ServerHandler extends SimpleChannelInboundHandler<String> {
@Override
public void userEventTriggered(final ChannelHandlerContext ctx, Object evt)
throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent event = (IdleStateEvent) evt;
if (event.state() == IdleState.ALL_IDLE) {
// 向客戶端傳送資料
ChannelFuture writeAndFlush = ctx
.writeAndFlush("you will close");
writeAndFlush
.addListener(new GenericFutureListener<Future<? super Void>>() {
public void operationComplete(
Future<? super Void> future)
throws Exception {
// 關閉會話
ctx.channel().close();
}
});
}
}
}
通過設定時間,當一個連線超過這個時間沒有連線時將觸發userEventTriggered方法。
相關文章
- 心跳包
- 聊聊心跳機制及netty心跳實現Netty
- 心跳檢測
- Ceph心跳機制
- 心跳檢測機制
- 我的javascript心跳機JavaScript
- Golang 心跳的實現Golang
- [Android]Okhttp心跳策略研究AndroidHTTP
- xxl-job心跳機制
- Kafka之消費與心跳Kafka
- Kafka消費與心跳機制Kafka
- 長連線的心跳保持設計
- 【NETWORK】Oracle RAC 心跳地址配置說明Oracle
- 【RAC】Oracle RAC如何修改心跳網路Oracle
- 叢集通訊:從心跳說起
- RAC資料庫心跳更換方案資料庫
- Android之Mina頻繁傳送心跳包Android
- 聊聊 TCP 長連線和心跳那些事TCP
- 深入淺出etcd系列 – 心跳和選舉
- Keepalived檢測mysql 3306心跳的指令碼MySql指令碼
- 好用的websocket 心跳重連js指令碼WebJS指令碼
- 理解WebSocket心跳及重連機制(五)Web
- Spring Boot Admin使用及心跳檢測原理Spring Boot
- swoole 的練習 demo(5)- 加入心跳功能
- Nacos - 服務端處理心跳請求服務端
- 長連線的心跳及重連設計
- 微信小程式實現WebSocket心跳重連微信小程式Web
- Oracle 叢集心跳及其引數misscount/disktimeout/reboottimeOracleboot
- Netty(一) SpringBoot 整合長連線心跳機制NettySpring Boot
- 無人機get新技能,惹黑熊心跳加速無人機
- MySQL主從複製配置心跳功能介紹MySql
- JAVA之長連線、短連線和心跳包Java
- 如何設計一個優雅的心跳機制
- 移動IM開發指南2:心跳指令詳解
- UAV心跳機制與容器、程式資料採集
- [原始碼解析] 從TimeoutException看Flink的心跳機制原始碼Exception
- websocket-heartbeat-js心跳檢測庫正式釋出WebJS
- Spark RPC框架原始碼分析(三)Spark心跳機制分析SparkRPC框架原始碼
- 一次ceph心跳機制異常的處理