ソースを参照

增加网络连接状态监听,网络连接后连接TCP及RTC,RTC reconnect无效,使用connect连接正常,增加 tcp 连接过程中的重连机制

allen 3 年 前
コミット
82a732a682

+ 1 - 0
WebRTC/src/main/java/com/wdkl/core/socket/SocketManager.java

@@ -372,6 +372,7 @@ public class SocketManager implements IEvent {
 
     @Override
     public void reConnect() {
+        Log.w(TAG,"重连RTC");
         handler.post(() -> {
             if (webSocket!=null) {
                 webSocket.reconnect();

+ 6 - 0
home/src/main/AndroidManifest.xml

@@ -48,6 +48,12 @@
             </intent-filter>
         </service>
 
+        <receiver android:name=".util.NetWorkChangeReceiver" >
+            <intent-filter>
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
+            </intent-filter>
+        </receiver>
+
         <provider
             android:name="android.support.v4.content.FileProvider"
             android:authorities="${applicationId}.provider"

+ 14 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -1,17 +1,15 @@
 package com.wdkl.ncs.android.component.home.service
 
 import android.content.Intent
+import android.content.IntentFilter
 import android.os.Handler
 import android.os.IBinder
 import android.os.Messenger
-import android.text.TextUtils
 import android.util.Log
 import com.alibaba.fastjson.JSON
-import com.google.common.base.Strings
 import com.google.gson.FieldNamingPolicy
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
-import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.SocketManager
 import com.wdkl.ncs.android.component.home.activity.*
 import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
@@ -45,9 +43,19 @@ class WdKeepAliveService : AbsWorkService() {
     }
 
     private var mIsRunning = false
+    private lateinit var netWorkChangeReceiver:NetWorkChangeReceiver
 
     override fun startWork() {
         EventBus.getDefault().register(this)
+
+        // 动态注册广播接收器
+        // 过滤器
+        val intentFilter = IntentFilter()
+        // 系统的网络被更改的过滤器
+        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
+        netWorkChangeReceiver = NetWorkChangeReceiver()
+        registerReceiver(netWorkChangeReceiver, intentFilter)
+
         checkNetState()
     }
 
@@ -68,6 +76,9 @@ class WdKeepAliveService : AbsWorkService() {
 
     override fun onServiceKilled() {
         EventBus.getDefault().unregister(this)
+        if (netWorkChangeReceiver!=null){
+            unregisterReceiver(netWorkChangeReceiver)
+        }
     }
 
     @Subscribe(threadMode = ThreadMode.MAIN)

+ 4 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/util/HandleTcpConnect.kt

@@ -35,7 +35,8 @@ class HandleTcpConnect {
         NettyClient.instance.reConnect().subscribe {
             if (it){
                 Log.d(TAG, "TCP.重连成功,开始重连RTC")
-                SocketManager.getInstance().reConnect()
+                SocketManager.getInstance().unConnect()
+                SocketManager.getInstance().connect(Urls.WS,Constants.sipId,0)
             } else {
                 Log.e(TAG, "TCP.重连失败")
             }
@@ -48,7 +49,8 @@ class HandleTcpConnect {
         NettyClient.instance.reConnect().subscribe{
             if (it){
                 Log.d(TAG, "服务重连成功")
-                SocketManager.getInstance().reConnect()
+                SocketManager.getInstance().unConnect()
+                SocketManager.getInstance().connect(Urls.WS,Constants.sipId,0)
                 showMessage("重连成功,请重试")
             } else {
                 Log.d(TAG, "服务重连失败")

+ 67 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/NetWorkChangeReceiver.kt

@@ -0,0 +1,67 @@
+package com.wdkl.ncs.android.component.home.util
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.net.ConnectivityManager
+import android.net.Network
+import android.net.NetworkInfo
+import android.os.Build
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
+
+class NetWorkChangeReceiver : BroadcastReceiver() {
+    override fun onReceive(context: Context?, intent: Intent?) {
+        // API版本23以上使用
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            // 链接管理器(获取系统链接服务)
+            val manager: ConnectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+            //获取所有网络连接的信息
+            val networks: Array<Network> = manager.allNetworks
+            var networkInfo: NetworkInfo? = null
+            //通过循环将网络信息逐个取出来
+            for (network in networks) {
+                networkInfo = manager.getNetworkInfo(network)
+            }
+
+            // 判断网络是否可用
+            if (null != networkInfo && networkInfo.isAvailable) {
+                //当前网络可用
+            }
+            // 判断网络是否链接
+            if (null != networkInfo && networkInfo.isConnected) {
+                //当前网络已经链接
+                if (!NettyClient.instance.isConnect()){
+                    HandleTcpConnect.instance.tcpReConnect()
+                }
+            }
+            // 判断网络是否正在链接
+            if (null != networkInfo && networkInfo.isConnectedOrConnecting) {
+                //当前网络正在链接
+            }
+            // 判断网络链接失败
+            if (null != networkInfo && networkInfo.isFailover) {
+                //当前网络链接失败
+            }
+            // 判断网络是否赞漫游
+            if (null != networkInfo && networkInfo.isRoaming) {
+                //当前处于漫游网络
+            }
+        } else { // API版本23以下使用
+            // 链接管理器(获取系统链接服务)
+            val manager: ConnectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+
+            //获取ConnectivityManager对象对应的NetworkInfo对象
+            //获取WIFI连接的信息
+            val wifiNetworkInfo: NetworkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
+            //获取移动数据连接的信息
+            val dataNetworkInfo: NetworkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
+            if (wifiNetworkInfo.isConnected || dataNetworkInfo.isConnected) {
+                //WIFI已连接 或 移动数据已连接
+
+                if (!NettyClient.instance.isConnect()){
+                    HandleTcpConnect.instance.tcpReConnect()
+                }
+            }
+        }
+    }
+}

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/config/WdklNcsConfigCenter.kt

@@ -22,7 +22,7 @@ class WdklNcsConfigCenter {
     /**
      *  是否处于开发模式
      */
-    val APP_DEV = false
+    val APP_DEV = true
 
     /**
      * 基础URL

+ 18 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/NettyClient.kt

@@ -2,10 +2,12 @@ package com.wdkl.ncs.android.middleware.tcp
 
 import android.util.Log
 import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.wdkl.ncs.android.lib.utils.AppTool
 import io.netty.bootstrap.Bootstrap
 import io.netty.channel.Channel
 import io.netty.channel.ChannelInitializer
 import io.netty.channel.ChannelOption
+import io.netty.channel.EventLoop
 import io.netty.channel.nio.NioEventLoopGroup
 import io.netty.channel.socket.SocketChannel
 import io.netty.channel.socket.nio.NioSocketChannel
@@ -34,6 +36,12 @@ class NettyClient{
     private lateinit var bootstrap: Bootstrap
     private var channel: Channel? = null
 
+    //重连间隔
+    private val retrySeconds : Long = 2
+
+    //重连计数
+    private var retryTimes = 0
+
     private lateinit var ip: String
     private var port by Delegates.notNull<Int>()
     private var heartBeatSeconds by Delegates.notNull<Long>()
@@ -84,8 +92,17 @@ class NettyClient{
                 it.onNext(channel!!.isActive)
                 isConnect = channel!!.isActive
             } catch (e: Exception) {
-                it.onNext(false)
                 isConnect = false
+
+                if (retryTimes>30){
+                    retryTimes = 0
+                    it.onNext(false)
+                } else {
+                    group.schedule(Runnable {
+                        reConnect()
+                        retryTimes++
+                    }, retrySeconds * retryTimes, TimeUnit.SECONDS)
+                }
             }
         }.compose(ThreadFromUtils.defaultSchedulers())
     }