From 704a7434b0494e84a578d719daacb72f995b2ad2 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期一, 30 十二月 2019 17:43:17 +0800
Subject: [PATCH] Merge branch 'master' of https://gitee.com/endian11/DriveJudge

---
 im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java |  296 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 220 insertions(+), 76 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 3cec3b8..73332d6 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
@@ -12,9 +12,13 @@
 import com.anyun.im_lib.listener.IMSConnectStatusCallback;
 import com.anyun.im_lib.listener.OnEventListener;
 
+import java.nio.ByteBuffer;
 import java.util.Vector;
+import java.util.function.ToDoubleBiFunction;
 
 import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelOption;
 import io.netty.channel.EventLoopGroup;
@@ -149,72 +153,8 @@
         }
     }
 
-    private class ResetConnectRunnable implements Runnable{
-        private boolean isFirst;
-        public ResetConnectRunnable(boolean isFirst) {
-            this.isFirst = isFirst;
-        }
 
-        @Override
-        public void run() {
-            if (!isFirst){
-                onConnectStatusCallback(IMSConfig.CONNECT_STATE_FAILURE);
-            }
-            try {
-                //閲嶈繛鏃讹紝閲婃斁宸ヤ綔缁勭嚎绋嬫睜锛屼篃灏辨槸鍋滄蹇冭烦
-                loopGroup.destroyWorkLoopGroup();
-                while (!isClosed){
-                    if (!isNetworkAvaliable()){
-                        try {
-                            Thread.sleep(2000);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        }
-                        continue;
-                    }
-                    //缃戠粶鍙敤鎵嶈繘琛岃繛鎺�
-                    int status;
-                    if ((status=reConnect()) == IMSConfig.CONNECT_STATE_SUCCESSFUL){
-                        onConnectStatusCallback(status);
-                        //杩炴帴鎴愬姛锛岃皟鍑哄惊鐜�
-                        break;
-                    }
 
-                    if (status == IMSConfig.CONNECT_STATE_FAILURE){
-                        onConnectStatusCallback(status);
-                        try {
-                            Thread.sleep(IMSConfig.DEFAULT_RECONNECT_INTERVAL);
-                        } catch (InterruptedException e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            } finally {
-                //鏍囪瘑閲嶈繛浠诲姟鍋滄
-                isReconnecting = false;
-            }
-        }
-    }
-
-    /**
-     * 閲嶈繛锛岄娆¤繛鎺ヤ篃璁や负鏄涓�娆¢噸杩�
-     * @return
-     */
-    private int reConnect() {
-        if (!isClosed){
-            try {
-                //鍏堥噴鏀綞ventLoop绾跨▼缁�
-                if (bootstrap != null){
-                    bootstrap.group().shutdownGracefully();
-                }
-            } finally {
-                    bootstrap = null;
-            }
-            initBootstrap();
-            return connectServer();
-        }
-        return IMSConfig.CONNECT_STATE_FAILURE;
-    }
 
     /***
      * 鍒濆鍖朆ootstrap
@@ -225,19 +165,29 @@
         bootstrap.group(loopGroup).channel(NioSocketChannel.class);
         // 璁剧疆璇ラ」浠ュ悗锛屽鏋滃湪涓ゅ皬鏃跺唴娌℃湁鏁版嵁閫氫俊鏃讹紝TCP浼氳嚜鍔ㄥ彂閫佷竴涓椿鍔ㄦ帰娴嬫暟鎹姤鏂�
         bootstrap.option(ChannelOption.SO_KEEPALIVE,true);
+        //璁剧疆绂佺敤nagle绠楁硶
+        bootstrap.option(ChannelOption.TCP_NODELAY,true);
         bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,getConnectTimeout());
         bootstrap.handler(new TCPChannelInitializerHandler(this));
     }
 
-    private int connectServer(){
-        if (serverUrlList == null || serverUrlList.size() == 0){
-            return IMSConfig.CONNECT_STATE_FAILURE;
-        }
-        for (int i = 0; i < serverUrlList.size(); i++) {
-            String serverUrl = serverUrlList.get(i);
-            if (TextUtils.isEmpty(serverUrl)){
-                return IMSConfig.CONNECT_STATE_FAILURE;
+
+    /**
+     * 鐪熸杩炴帴鏈嶅姟鍣ㄧ殑鍦版柟
+     */
+    private void toServer() {
+        try {
+            channel = bootstrap.connect(currentHost,currentPort).sync().channel();
+        } catch (Exception e) {
+            Log.i(TAG, String.format("杩炴帴Server(ip[%s],port[%d]澶辫触)",currentHost,currentPort));
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException ex) {
+                ex.printStackTrace();
             }
+
+
+            channel = null;
         }
     }
 
@@ -248,9 +198,46 @@
         return false;
     }
 
+    /**
+     * 鍥炶皟ims杩炴帴鐘舵��
+     * @param connectStateConnecting
+     */
     private void onConnectStatusCallback(int connectStateConnecting) {
+        this.connectStatus = connectStateConnecting;
+        switch (connectStatus){
+            case IMSConfig.CONNECT_STATE_CONNECTING:
+                Log.i(TAG, "onConnectStatusCallback: ims杩炴帴涓�...");
+                if (imsConnectStatusCallback != null){
+                    imsConnectStatusCallback.onConnecting();
+                }
+                break;
+            case IMSConfig.CONNECT_STATE_SUCCESSFUL:
+                Log.i(TAG, String.format("onConnectStatusCallback: ims杩炴帴鎴愬姛锛宧ost[%s],port[%s]",currentHost,currentPort));
+                if (imsConnectStatusCallback != null){
+                    imsConnectStatusCallback.onConnected();
+                }
+                // TODO: 2019/12/12  杩炴帴鎴愬姛 锛屽彂閫佹彙鎵嬫秷鎭紙闇�瑕佺殑璇濃�斺�旓級
+                try {
+                    ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer();
+                    byteBuf.writeBytes(mOnEventListener.getRegisterMessage());
+                    channel.writeAndFlush(byteBuf);
+                } catch (Exception e) {
+                    Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t");
+                }
+                break;
+            case IMSConfig.CONNECT_STATE_FAILURE:
+                default:
+                    Log.i(TAG, "onConnectStatusCallback: ims杩炴帴澶辫触");
+                    if (imsConnectStatusCallback != null){
+                        imsConnectStatusCallback.onConnectFailed();
+                    }
+                    break;
+        }
     }
 
+    /**
+     * 鍏抽棴杩炴帴锛屽悓鏃堕噴鏀捐祫婧�
+     */
     @Override
     public void close() {
         if (isClosed){
@@ -323,22 +310,51 @@
 
     @Override
     public void sendMsg(String msg) {
-
+        this.sendMsg(msg,true);
     }
 
+    /**
+     *
+     * @param msg
+     * @param isJoinTimeoutManager 鏄惁鍔犲叆瓒呮椂绠$悊鍣�
+     */
     @Override
     public void sendMsg(String msg, boolean isJoinTimeoutManager) {
+        if (msg==null ){
+            return;
+        }
+        // TODO: 2019/12/12  鏍规嵁MSG_ID 鏉ュ姞鍏� 瓒呮椂锛�  鏆備笉鍐�
 
+        if (channel == null){
+            Log.i(TAG, "sendMsg fail,channel涓虹┖"+msg);
+        }
+        try {
+            ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer();
+            byteBuf.writeBytes(msg.getBytes());
+            channel.writeAndFlush(byteBuf);
+        } catch (Exception e) {
+            Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t"+msg);
+        }
     }
 
+    /**
+     * 鑾峰彇瀹㈡埛璁剧疆鐨勯噸杩炴椂闀�
+     * @return
+     */
     @Override
     public int getReconnectInterval() {
-        return 0;
+        if (mOnEventListener != null && mOnEventListener.getReConnectInterval()>0){
+            return reconnectInterval = mOnEventListener.getReConnectInterval();
+        }
+        return reconnectInterval;
     }
 
     @Override
     public int getConnectTimeout() {
-        return 0;
+        if(mOnEventListener != null && mOnEventListener.getConnectTimeout()>0){
+            connectTimeOut = mOnEventListener.getConnectTimeout();
+        }
+        return connectTimeOut;
     }
 
     @Override
@@ -368,11 +384,139 @@
 
     @Override
     public MsgDispatcher getMsgDispatcher() {
-        return null;
+        return msgDispatcher;
     }
 
     @Override
     public MsgTimeOutTimerManager getMsgTimeOutTimerManager() {
+        return msgTimeOutTimerManager;
+    }
+
+    @Override
+    public byte[] getRegisterMessage() {
+        if (mOnEventListener != null){
+            return mOnEventListener.getRegisterMessage();
+        }
         return null;
     }
+
+
+    /**
+     * 閲嶈繛浠诲姟
+     */
+    private class ResetConnectRunnable implements Runnable{
+        private boolean isFirst;
+        public ResetConnectRunnable(boolean isFirst) {
+            this.isFirst = isFirst;
+        }
+
+        @Override
+        public void run() {
+            Log.i(TAG, "鎵ц閲嶈繛浠诲姟");
+            if (!isFirst){
+                onConnectStatusCallback(IMSConfig.CONNECT_STATE_FAILURE);
+            }
+            try {
+                //閲嶈繛鏃讹紝閲婃斁宸ヤ綔缁勭嚎绋嬫睜锛屼篃灏辨槸鍋滄蹇冭烦
+                loopGroup.destroyWorkLoopGroup();
+                while (!isClosed){
+                    if (!isNetworkAvaliable()){
+                        try {
+                            Thread.sleep(2000);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                        continue;
+                    }
+                    //缃戠粶鍙敤鎵嶈繘琛岃繛鎺�
+                    int status;
+                    if ((status=reConnect()) == IMSConfig.CONNECT_STATE_SUCCESSFUL){
+                        onConnectStatusCallback(status);
+                        //杩炴帴鎴愬姛锛岃皟鍑哄惊鐜�
+                        break;
+                    }
+
+                    if (status == IMSConfig.CONNECT_STATE_FAILURE){
+                        onConnectStatusCallback(status);
+                        try {
+                            Thread.sleep(IMSConfig.DEFAULT_RECONNECT_INTERVAL);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            } finally {
+                //鏍囪瘑閲嶈繛浠诲姟鍋滄
+                isReconnecting = false;
+            }
+        }
+
+        /**
+         * 閲嶈繛锛岄娆¤繛鎺ヤ篃璁や负鏄涓�娆¢噸杩�
+         * @return
+         */
+        private int reConnect() {
+            if (!isClosed){
+                try {
+                    //鍏堥噴鏀綞ventLoop绾跨▼缁�
+                    if (bootstrap != null){
+                        bootstrap.group().shutdownGracefully();
+                    }
+                } finally {
+                    bootstrap = null;
+                }
+                initBootstrap();
+                return connectServer();
+            }
+            return IMSConfig.CONNECT_STATE_FAILURE;
+        }
+
+        private int connectServer(){
+            //鏈嶅姟鍣ㄥ湴鍧�鏃犳晥锛岀洿鎺ュ洖璋冭繛鎺ョ姸鎬侊紝涓嶅啀杩涜杩炴帴
+            if (serverUrlList == null || serverUrlList.size() == 0){
+                return IMSConfig.CONNECT_STATE_FAILURE;
+            }
+            for (int i = 0; i < serverUrlList.size(); i++) {
+                String serverUrl = serverUrlList.get(i);
+                //鏈嶅姟鍣ㄥ湴鍧�鏃犳晥锛岀洿鎺ュ洖璋冭繛鎺ョ姸鎬侊紝涓嶅啀杩涜杩炴帴
+                if (TextUtils.isEmpty(serverUrl)){
+                    return IMSConfig.CONNECT_STATE_FAILURE;
+                }
+                String[] address = serverUrl.split(" ");
+                for (int j = 1; j <= IMSConfig.DEFAULT_RECONNECT_COUNT; j++) {
+                    //濡傛灉ims宸茬粡鍏抽棴锛屾垨缃戠粶涓嶅彲鐢紝鐩存帴鍥炶皟杩炴帴鐘舵�侊紝涓嶅啀杩涜杩炴帴
+                    if (isClosed || !isNetworkAvaliable()){
+                        return IMSConfig.CONNECT_STATE_FAILURE;
+                    }
+                    //鍥炶皟杩炴帴鐘舵��
+                    if(connectStatus != IMSConfig.CONNECT_STATE_CONNECTING){
+                        onConnectStatusCallback(IMSConfig.CONNECT_STATE_CONNECTING);
+                    }
+                    Log.i(TAG, String.format("姝e湪杩涜connectServer銆�%s銆戠殑绗琜%d]杩炴帴锛屽綋鍓嶉噸杩炲欢鏃舵椂闀夸负[%dms]: ",serverUrl,j,j*getReconnectInterval()));
+                    try {
+                        currentPort = Integer.parseInt(address[1]);
+                        currentHost = address[0];
+                        //杩炴帴鏈嶅姟鍣�
+                        toServer();
+                        //channel涓嶄负绌猴紝鍒欒涓鸿繛鎺ュ凡缁忔垚鍔�
+                        if(channel != null){
+                            return IMSConfig.CONNECT_STATE_SUCCESSFUL;
+                        }else{
+                            Thread.sleep(j*getReconnectInterval());
+                        }
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                        close();
+                        break;
+                    }
+                }
+            }
+            return IMSConfig.CONNECT_STATE_FAILURE;
+        }
+
+    }
+
+
+
+
 }

--
Gitblit v1.8.0