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
- 心跳包
- 聊聊心跳機制及netty心跳實現Netty
- go websocket心跳GoWeb
- Ceph心跳機制
- Oracle Clusterware的心跳Oracle
- java 心跳機制Java
- 我的javascript心跳機JavaScript
- Golang 心跳的實現Golang
- 心跳檢測機制
- [Android]Okhttp心跳策略研究AndroidHTTP
- Kafka之消費與心跳Kafka
- Kafka消費與心跳機制Kafka
- HACMP 5.4配置磁碟心跳(轉載)ACM
- HACMP 5.4磁碟心跳配置過程ACM
- ORACLE RAC 心跳是否可以直連Oracle
- xxl-job心跳機制
- 長連線的心跳保持設計
- 叢集通訊:從心跳說起
- RAC資料庫心跳更換方案資料庫
- 【RAC】Oracle RAC如何修改心跳網路Oracle
- 無人機get新技能,惹黑熊心跳加速無人機
- MongoDB副本集心跳和同步機制MongoDB
- 檢視心跳線使用哪個IP
- 微信小程式實現WebSocket心跳重連微信小程式Web
- 【NETWORK】Oracle RAC 心跳地址配置說明Oracle
- 聊聊 TCP 長連線和心跳那些事TCP
- Nacos - 服務端處理心跳請求服務端
- 理解WebSocket心跳及重連機制(五)Web
- 好用的websocket 心跳重連js指令碼WebJS指令碼
- 長連線的心跳及重連設計
- MySQL主從複製配置心跳功能介紹MySql
- 深入淺出etcd系列 – 心跳和選舉
- css3實現的紅心跳動效果CSSS3
- 【Socket】關於socket長連線的心跳包
- 使用oswatcher監控rac的心跳網路
- UAV心跳機制與容器、程式資料採集
- websocket-heartbeat-js心跳檢測庫正式釋出WebJS