From 95f1e1c0fb9f8501630c349de61859826963ca90 Mon Sep 17 00:00:00 2001
From: lizhanwei <Dana_Lee1016@126.com>
Date: 星期六, 22 二月 2020 14:46:32 +0800
Subject: [PATCH] 设定IdleStateHandler心跳检测每四秒进行一次写检测,如果四秒内write()方法未被调用则触发一次userEventTrigger()方法,实现客户端每四秒向服务端发送一次心跳消息
---
im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 53 insertions(+), 0 deletions(-)
diff --git a/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java b/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java
index a0e4314..f85db3a 100644
--- a/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java
+++ b/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java
@@ -1,6 +1,13 @@
package com.anyun.im_lib;
+import com.anyun.im_lib.netty.NettyTcpClient;
+import com.anyun.im_lib.util.MyLog;
+import com.safeluck.aykj.utils.BytesUtils;
+
+import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.handler.timeout.IdleState;
+import io.netty.handler.timeout.IdleStateEvent;
/**
* MyApplication2
@@ -9,4 +16,50 @@
* All Rights Saved! Chongqing AnYun Tech co. LTD
*/
public class HeartbeatHandler extends ChannelInboundHandlerAdapter {
+ private NettyTcpClient imsClient;
+ public HeartbeatHandler(NettyTcpClient imsClient) {
+ this.imsClient = imsClient;
+ }
+ private HeartbeatTask heartbeatTask;
+ private class HeartbeatTask implements Runnable {
+
+ private ChannelHandlerContext ctx;
+
+ public HeartbeatTask(ChannelHandlerContext ctx) {
+ this.ctx = ctx;
+ }
+
+ @Override
+ public void run() {
+ if (ctx.channel().isActive()) {
+ byte []heartbeatMsg = imsClient.getHeartbeatMsg();
+ if (heartbeatMsg == null) {
+ return;
+ }
+ MyLog.i("鍙戦�佸績璺虫秷鎭紝message=" + BytesUtils.bytesToHexString(heartbeatMsg) + "褰撳墠蹇冭烦闂撮殧涓猴細" +imsClient.getHeartbeatInterval() + "ms\n");
+ imsClient.sendMsg(heartbeatMsg, false);
+ }
+ }
+ }
+ @Override
+ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
+ super.userEventTriggered(ctx, evt);
+ if (evt instanceof IdleStateEvent){
+ IdleState state = ((IdleStateEvent)evt).state();
+ MyLog.i("Netty TCP Idlestate="+state.name());
+ switch (state){
+ case READER_IDLE:
+ // 瑙勫畾鏃堕棿鍐呮病鏀跺埌鏈嶅姟绔績璺冲寘鍝嶅簲锛岃繘琛岄噸杩炴搷浣�
+ break;
+ case WRITER_IDLE:
+ // 瑙勫畾鏃堕棿鍐呮病鍚戞湇鍔$鍙戦�佸績璺冲寘锛屽嵆鍙戦�佷竴涓績璺冲寘
+ if (heartbeatTask == null) {
+ heartbeatTask = new HeartbeatTask(ctx);
+ }
+ imsClient.getLoopGroup().execWorkTask(heartbeatTask);
+ break;
+
+ }
+ }
+ }
}
--
Gitblit v1.8.0