Netty心跳保活demo
阿新 • • 發佈:2021-01-11
技術標籤:netty
- Netty心跳保活
客戶端定時傳送訊息到服務端,超過指定時間,計為1次超時,達到指定次數,服務端傳送關閉訊息到客戶端。客戶端自動下線。
服務端新增IdleStateHandler到pipeline
//IdleStateHandler的readerIdleTime引數指定超過3秒還沒收到客戶端的連線,
//會觸發IdleStateEvent事件並且交給下一個handler處理,下一個handler必須
//實現userEventTriggered方法處理對應事件
pipeline.addLast(new IdleStateHandler(3, 0, 0, TimeUnit.SECONDS) );
pipeline.addLast(new HeartBeatServerHandler());
實現userEventTriggered
int readIdleTimes = 0;
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
IdleStateEvent event = (IdleStateEvent) evt;
String eventType = null;
switch (event.state()) {
case READER_IDLE:
eventType = "讀空閒";
readIdleTimes++; // 讀空閒的計數加1
break;
case WRITER_IDLE:
eventType = "寫空閒";
// 不處理
break;
case ALL_IDLE:
eventType = "讀寫空閒";
// 不處理
break;
}
System.out.println(ctx.channel().remoteAddress() + "超時事件:" + eventType);
if (readIdleTimes > 3) {
System.out.println(" [server]讀空閒超過3次,關閉連線,釋放更多資源");
ctx.channel().writeAndFlush("idle close");
ctx.channel().close();
}
}
客戶端判斷訊息是否需要下線
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
System.out.println(" client received :" + msg);
if (null != msg && msg.equals("idle close")) {
System.out.println(" 服務端關閉連線,客戶端也關閉");
ctx.channel().closeFuture();
}
}
詳細程式碼:github