手把手教你搭建应用的网络诊断模块(1)——Ping与TraceRoute

本文介绍了如何在Android应用中利用Ping和TraceRoute命令检测网络状况,通过轻量级模块收集网络信息,提升用户体验并定位网络问题。

「椎锋陷陈」微信技术号现已开通,为了获得第一手的技术文章推送,欢迎搜索关注!

前言

一个App功能的整体表现,往往与用户当前的网络状况密不可分。通过为App引入一个轻量级的网络诊断模块,收集那些能够衡量当前网络状况的重要信息,然后在征得用户同意的情况下,将信息上报到服务端进行分析,可以有针对性地对网络链路中的薄弱环节进行优化。

众所周知,Android系统基于Linux内核的,Linux本身就提供了许多可用于检测网络状况的工具,熟练地运用这些工具,可以很轻松地达到我们网络诊断的目的。今天要分享的就是其中的两个工具,Ping命令与TraceRoute命令。

网络工具介绍

Ping

声呐技术

「Ping」这个名字源于声呐技术,声呐技术是利用声波在水中的传播和反射特性,对水下目标进行探测、分类、定位和跟踪的技术。

概述

Ping命令是用于检测从源主机到目标主机是否可达的工具。

该命令基于ICMP协议,通过向目标主机发送指定个数与大小的回送请求(echo request)数据包,并要求目标主机在收到之后返回相应的回送应答(echo reply)数据包,最终结合数据包的往返时间丢包率来评估网络连接状况。

图示

ping命令模型

如果用开头提及的声呐技术来类比,就会是这样的一个对应关系:

对应关系

形式

Ping命令的基本形式如下:

ping [-c 数据包个数] [-s 数据包大小] [主机名/IP地址]

例:

ping -c 5 -s 56 developer.android.google.cn

默认情况下,假如不指定数据包个数,Ping命令就会连续发送数据包,如果仅仅是为了进行连通性测试,只需要指定3到5个即可。

而假如不指定数据包大小,则默认是56 bytes。

实现

Android支持直接使用命令行工具执行Ping命令,因此只需设定好参数,逐行读取输出内容即可:

/**
 * Ping命令
 */
class Ping(
    /** 目标主机域名/IP地址  */
    private val host: String,
    /** 数据包个数,默认连续发送  */
    private val count: Int? = null,
    /** 数据包大小,单位bytes,默认为56 bytes  */
    private val packetSize: Int? = null,
    /** 数据包生存时间 */
    private val ttl: Int? = null,
    /** 超时间隔,单位s */
    private val deadline: Int? = null
) {

    /**
     * ## 执行Ping命令
     * 请注意,ping命令在Linux系统下的参数与在Windows系统下有差异,需要区分
     * -c count ping指定次数后停止ping;
     * -s packetsize 指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节;
     */
    fun execute(callback: ExecuteCallback? = null): String {
        val command = toString()
        // 回调输出执行的Ping命令
        callback?.onExecuting("% $command\n")

        val result = StringBuilder()
        var process: Process? = null
        var reader: BufferedReader? = null
        try {
            process = Runtime.getRuntime().exec(command)
            reader = BufferedReader(InputStreamReader(process.inputStream))
            // 读取首行输出内容
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值