美文网首页
一个Android下ping的简单工具类

一个Android下ping的简单工具类

作者: 孤诣 | 来源:发表于2016-05-20 05:30 被阅读4779次

    这是一个自己写的Android下的ping的简单工具类,主要是通过ping获取到返回字符串之后截取信息得到自己想要的数据。不多说,上源码

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URI;
    import java.util.regex.Pattern;
    
    import android.support.v4.util.ArrayMap;
    
    /**
     * 类描述:手机ping工具类<br>
     * 权限 <uses-permission android:name="android.permission.INTERNET"/> <br>
     * 由于涉及网络,建议异步操作<br>
     * 创建人:liangkuan<br>
     * 创建时间:2016/4/23 14:05<br>
     */
    public class PingUtil
    {
        
        private static final String ipRegex =
            "((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))";
            
        /**
         * 获取由ping url得到的IP地址
         *
         * @param url 需要ping的url地址
         * @return url的IP地址 如 192.168.0.1
         */
        public static String getIPFromUrl(String url)
        {
            String domain = getDomain(url);
            if (null == domain)
            {
                return null;
            }
            if (isMatch(ipRegex, domain))
            {
                return domain;
            }
            String pingString = ping(createSimplePingCommand(1, 100, domain));
            if (null != pingString)
            {
                try
                {
                    String tempInfo = pingString.substring(pingString.indexOf("from") + 5);
                    return tempInfo.substring(0, tempInfo.indexOf("icmp_seq") - 2);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return null;
        }
        
        /**
         * 获取ping最小RTT值
         *
         * @param url 需要ping的url地址
         * @return 最小RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getMinRTT(String url)
        {
            return getMinRTT(url, 1, 100);
        }
        
        /**
         * 获取ping的平均RTT值
         *
         * @param url 需要ping的url地址
         * @return 平均RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getAvgRTT(String url)
        {
            return getAvgRTT(url, 1, 100);
        }
        
        /**
         * 获取ping的最大RTT值
         *
         * @param url 需要ping的url地址
         * @return 最大RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getMaxRTT(String url)
        {
            return getMaxRTT(url, 1, 100);
        }
        
        /**
         * 获取ping的RTT的平均偏差
         *
         * @param url 需要ping的url地址
         * @return RTT平均偏差,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getMdevRTT(String url)
        {
            return getMdevRTT(url, 1, 100);
        }
        
        /**
         * 获取ping url的最小RTT
         *
         * @param url 需要ping的url地址
         * @param count 需要ping的次数
         * @param timeout 需要ping的超时,单位ms
         * @return 最小RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getMinRTT(String url, int count, int timeout)
        {
            String domain = getDomain(url);
            if (null == domain)
            {
                return -1;
            }
            String pingString = ping(createSimplePingCommand(count, timeout, domain));
            if (null != pingString)
            {
                try
                {
                    String tempInfo = pingString.substring(pingString.indexOf("min/avg/max/mdev") + 19);
                    String[] temps = tempInfo.split("/");
                    return Math.round(Float.valueOf(temps[0]));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return -1;
        }
        
        /**
         * 获取ping url的平均RTT
         *
         * @param url 需要ping的url地址
         * @param count 需要ping的次数
         * @param timeout 需要ping的超时时间,单位 ms
         * @return 平均RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getAvgRTT(String url, int count, int timeout)
        {
            String domain = getDomain(url);
            if (null == domain)
            {
                return -1;
            }
            String pingString = ping(createSimplePingCommand(count, timeout, domain));
            if (null != pingString)
            {
                try
                {
                    String tempInfo = pingString.substring(pingString.indexOf("min/avg/max/mdev") + 19);
                    String[] temps = tempInfo.split("/");
                    return Math.round(Float.valueOf(temps[1]));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return -1;
        }
        
        /**
         * 获取ping url的最大RTT
         *
         * @param url 需要ping的url地址
         * @param count 需要ping的次数
         * @param timeout 需要ping的超时时间,单位ms
         * @return 最大RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getMaxRTT(String url, int count, int timeout)
        {
            String domain = getDomain(url);
            if (null == domain)
            {
                return -1;
            }
            String pingString = ping(createSimplePingCommand(count, timeout, domain));
            if (null != pingString)
            {
                try
                {
                    String tempInfo = pingString.substring(pingString.indexOf("min/avg/max/mdev") + 19);
                    String[] temps = tempInfo.split("/");
                    return Math.round(Float.valueOf(temps[2]));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return -1;
        }
        
        /**
         * 获取RTT的平均偏差
         *
         * @param url 需要ping的url
         * @param count 需要ping的次数
         * @param timeout 需要ping的超时时间,单位ms
         * @return RTT平均偏差,单位 ms 注意:-1是默认值,返回-1表示获取失败
         */
        public static int getMdevRTT(String url, int count, int timeout)
        {
            String domain = getDomain(url);
            if (null == domain)
            {
                return -1;
            }
            String pingString = ping(createSimplePingCommand(count, timeout, domain));
            if (null != pingString)
            {
                try
                {
                    String tempInfo = pingString.substring(pingString.indexOf("min/avg/max/mdev") + 19);
                    String[] temps = tempInfo.split("/");
                    return Math.round(Float.valueOf(temps[3].replace(" ms", "")));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return -1;
        }
        
        /**
         * 获取ping url的丢包率,浮点型
         *
         * @param url 需要ping的url地址
         * @return 丢包率 如50%可得 50,注意:-1是默认值,返回-1表示获取失败
         */
        public static float getPacketLossFloat(String url)
        {
            String packetLossInfo = getPacketLoss(url);
            if (null != packetLossInfo)
            {
                try
                {
                    return Float.valueOf(packetLossInfo.replace("%", ""));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return -1;
        }
        
        /**
         * 获取ping url的丢包率,浮点型
         *
         * @param url 需要ping的url地址
         * @param count 需要ping的次数
         * @param timeout 需要ping的超时时间,单位 ms
         * @return 丢包率 如50%可得 50,注意:-1是默认值,返回-1表示获取失败
         */
        public static float getPacketLossFloat(String url, int count, int timeout)
        {
            String packetLossInfo = getPacketLoss(url, count, timeout);
            if (null != packetLossInfo)
            {
                try
                {
                    return Float.valueOf(packetLossInfo.replace("%", ""));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return -1;
        }
        
        /**
         * 获取ping url的丢包率
         *
         * @param url 需要ping的url地址
         * @return 丢包率 x%
         */
        public static String getPacketLoss(String url)
        {
            return getPacketLoss(url, 1, 100);
        }
        
        /**
         * 获取ping url的丢包率
         *
         * @param url 需要ping的url地址
         * @param count 需要ping的次数
         * @param timeout 需要ping的超时时间,单位ms
         * @return 丢包率 x%
         */
        public static String getPacketLoss(String url, int count, int timeout)
        {
            String domain = getDomain(url);
            if (null == domain)
            {
                return null;
            }
            String pingString = ping(createSimplePingCommand(count, timeout, domain));
            if (null != pingString)
            {
                try
                {
                    String tempInfo = pingString.substring(pingString.indexOf("received,"));
                    return tempInfo.substring(9, tempInfo.indexOf("packet"));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return null;
        }
        
        // ********************以下是一些辅助方法********************//
        private static String getDomain(String url)
        {
            String domain = null;
            try
            {
                domain = URI.create(url).getHost();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return domain;
        }
        
        private static boolean isMatch(String regex, String string)
        {
            return Pattern.matches(regex, string);
        }
        
        private static String ping(String command)
        {
            Process process = null;
            try
            {
                process = Runtime.getRuntime().exec(command);
                InputStream is = process.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line;
                while (null != (line = reader.readLine()))
                {
                    sb.append(line);
                    sb.append("\n");
                }
                reader.close();
                is.close();
                return sb.toString();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (null != process)
                {
                    process.destroy();
                }
            }
            return null;
        }
        
        private static String createSimplePingCommand(int count, int timeout, String domain)
        {
            return "/system/bin/ping -c " + count + " -w " + timeout + " " + domain;
        }
        
        private static String createPingCommand(ArrayMap<String, String> map, String domain)
        {
            String command = "/system/bin/ping";
            int len = map.size();
            for (int i = 0; i < len; i++)
            {
                command = command.concat(" " + map.keyAt(i) + " " + map.get(map.keyAt(i)));
            }
            command = command.concat(" " + domain);
            return command;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:一个Android下ping的简单工具类

          本文链接:https://www.haomeiwen.com/subject/khzgrttx.html