Skip to content

NetworkDetector

xinbaicheng edited this page Mar 20, 2017 · 3 revisions

网络探测

因Android系统的限制,Android端的网络探测只支持Tracker模式,只支持Tracker模式下的PING方式

一、功能描述

  • Ping方式:相当于执行ping命令
    • 功能:检查端到端的连通性,查看对端的响应时间(包括最短,最长,平均)及丢包率
    • 优缺点:探测过程快,结果简明易懂,但是无法知道链路上各节点状况
    • 适用场景:在不关心链路上各节点信息,只希望判断对端可用性的情况下推荐该方式

二、功能实现

  • v1.7.4及以上版本
  • 所有功能均由类KSYNetworkDetector实现

三、配置

Tracker模式提供了过配置类KSYNetworkTrackerConfig,有相应的settergetter
下面以setter为例,展示Tracker模式下的可配置选项

方法名 含义
setTimeout 设置超时阈值,单位:秒
setMaxTimeToLiveCount 设置TTL阈值
setDetectCount 设置探测次数

四、探测结果

Tracker模式提供了类KSYTrackerRouterInfo记录某个节点的信息
下面将介绍某个节点可获取的信息

方法名 返回值 含义
getRouterIP ArrayList 获取节点IP,探测报文的转发路径出现变化,可能有多个IP的情况
getMaxDelay float 获取网络探测过程中延迟的最大值
getMinDelay float 获取网络探测过程中延迟的最小值
getAverageDelay float 获取网络探测过程中延迟的平均值
getDelayAverageDeviation float 获取延迟的平均偏差
getPacketLossRate float 获取丢包率

五、消息通知

1. KSY_NETWORK_DETECTION_EVENT_ONCE_DONE

  • 完成一次探测时发送一次通知
  • 监听到此消息后可通过KSYTrackerRouterInfo获取已完成的统计结果

2. KSYNetTrackerFinishedNotification

  • 完成所有探测通知时发送此消息
  • 监听到此消息后可通过routerInfo获取全部统计结果
  • 获取到探测结果后需要调用stop方法结束本次探测

3. KSYNetTrackerErrorNotification

  • 探测过程中出现错误时发送此消息
  • 监听到此消息后,应调用stop方法结束探测

六、调用示例

// 网络探测信息监听器
private KSYNetworkDetector.OnNetworkDetectionEventListener mListener = new KSYNetworkDetector.OnNetworkDetectionEventListener() {
    @Override
    public void onNetworkDetectInfo(int what, int extra, double value) {
        switch (what) {
            case KSYNetworkDetector.KSY_NETWORK_DETECTION_EVENT_ONCE_DONE:
                // 每做完一次PING操作会有此回调,告知这是第几次网络探测,当次探测耗时,单位为毫秒
                Log.d(TAG, "Current Detect Count:"+extra+", time cost:"+value+" ms");
                break;
            case KSYNetworkDetector.KSY_NETWORK_DETECTION_EVENT_FINISH:
                ArrayList<KSYTrackerRouterInfo> outcomes = KSYNetworkDetector.getInstance().getTrackerDetectResult();
                // 处理网络探测结果
                break;
            case KSYNetworkDetector.KSY_NETWORK_DETECTION_EVENT_ERROR:
                // 网络探测出错,停止
                KSYNetworkDetector.getInstance().stop();
                break;
        }
    }
};

// 设置监听器
KSYNetworkDetector.getInstance().setOnNetworkDetectionEventListener(mListener);

// 创建Tracker网络探测器,探测方式只能为PING方式
int ret = KSYNetworkDetector.getInstance().open(KSYNetworkDetector.KSY_NETWORK_DETECTOR_TYPE_TRACKER);
if (ret < 0)
   return;

// 获取当前网络探测配置,此步骤不是必须
KSYNetworkTrackerConfig currentConfig = KSYNetworkDetector.getInstance().getTrackerConfig();
currentConfig.setTimeout(10);
// ...

// 该方法第二个参数可传null,表示使用默认配置
KSYNetworkDetector.getInstance().start("www.baidu.com", currentConfig);
Clone this wiki locally