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/netty/NettyTcpClient.java |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java
index aec3868..0c6112b 100644
--- a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java
+++ b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java
@@ -17,6 +17,7 @@
 
 import java.nio.ByteBuffer;
 import java.util.Vector;
+import java.util.concurrent.TimeUnit;
 import java.util.function.ToDoubleBiFunction;
 
 import io.netty.bootstrap.Bootstrap;
@@ -405,6 +406,34 @@
         return null;
     }
 
+    @Override
+    public byte[] getHeartbeatMsg() {
+        if (mOnEventListener != null){
+            return mOnEventListener.getHearbeatMsg();
+        }
+        return null;
+    }
+
+
+
+    /**
+     * 澧炲姞蹇冭烦锛�
+     * @param heartBeatInterval 绉�
+     */
+    @Override
+    public void addHeartbeatHandler(int heartBeatInterval){
+        this.heartBeatInterval = heartBeatInterval*1000;
+        _addHeartbeatHandler();
+    }
+
+    public int getHeartbeatInterval() {
+        return this.heartBeatInterval;
+    }
+
+    public ExecutorServiceFactory getLoopGroup() {
+        return loopGroup;
+    }
+
 
     /**
      * 閲嶈繛浠诲姟
@@ -522,6 +551,37 @@
     }
 
 
+    private void _addHeartbeatHandler(){
+        MyLog.i("add HeartbeatHandler");
+        if (channel == null || !channel.isActive() || channel.pipeline()==null){
+            MyLog.i("PlatformMessage","娣诲姞蹇冭烦handler澶辫触");
+            return;
+        }
+        try {
+            if(channel.pipeline().get(IdleStateHandler.class.getSimpleName()) != null){
+                MyLog.i("PlatformMessage","涔嬪墠瀛樺湪鐨勮鍐欒秴鏃秇andler锛屽厛绉婚櫎鎺夛紝鍐嶉噸鏂版坊鍔�");
+                channel.pipeline().remove(IdleStateHandler.class.getSimpleName());
+            }
+            // 3娆″績璺虫病鍝嶅簲锛屼唬琛ㄨ繛鎺ュ凡鏂紑
+            //璁惧畾IdleStateHandler蹇冭烦妫�娴嬫瘡鍥涚杩涜涓�娆″啓妫�娴嬶紝濡傛灉鍥涚鍐厀rite()鏂规硶鏈璋冪敤鍒欒Е鍙戜竴娆serEventTrigger()鏂规硶锛屽疄鐜板鎴风姣忓洓绉掑悜鏈嶅姟绔彂閫佷竴娆℃秷鎭紱
+            channel.pipeline().addFirst(IdleStateHandler.class.getSimpleName(), new IdleStateHandler(
+                    0, heartBeatInterval, 0, TimeUnit.MILLISECONDS));
+
+            // 閲嶆柊娣诲姞HeartbeatHandler
+            if (channel.pipeline().get(HeartbeatHandler.class.getSimpleName()) != null) {
+                channel.pipeline().remove(HeartbeatHandler.class.getSimpleName());
+            }
+            if (channel.pipeline().get(TCPReadHandler.class.getSimpleName()) != null) {
+                MyLog.i("涔嬪墠瀛樺湪鐨勫厛绉婚櫎鎺夛紝鍐嶉噸鏂版坊鍔燞eartbeatHandler");
+                channel.pipeline().addBefore(TCPReadHandler.class.getSimpleName(), HeartbeatHandler.class.getSimpleName(),
+                        new HeartbeatHandler(this));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            MyLog.i("娣诲姞蹇冭烦娑堟伅绠$悊handler澶辫触锛宺eason锛�" + e.getMessage());
+        }
+    }
+
 
 
 }

--
Gitblit v1.8.0