Android 解析ping回复包

目标:

已知多个字符串,形如:"64 bytes from 39.156.66.18: icmp_seq=1 ttl=50 time=29.7 ms"

获取 总Ping时间(XX:XX:XX格式),最小时间,最大时间,平均时间,丢包率,已发送个数,已接收个数

示例程序:

java 复制代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;

private class PingThread extends Thread {
    // ...

    // 使用正则表达式匹配,从ping输出中提取特定值
    private static final Pattern PING_PATTERN = Pattern.compile("time=(\\d+\\.\\d+) ms");
    private static final Pattern PACKET_LOSS_PATTERN = Pattern.compile("(\\d+)% packet loss");
    private static final Pattern PACKETS_SENT_PATTERN = Pattern.compile("(\\d+) packets transmitted");
    private static final Pattern PACKETS_RECEIVED_PATTERN = Pattern.compile("(\\d+) packets received");

    @Override
    public void run() {
        super.run();

        // ... 

        int packetsSent = 0;
        int packetsReceived = 0;
        float packetLoss = 0.0f;
        long minPingTime = Long.MAX_VALUE;
        long maxPingTime = Long.MIN_VALUE;
        long totalPingTime = 0;

        try {
            // ... 

            // 读取标准输入流
            while ((line = successReader.readLine()) != null) {
                System.out.println("Message: " + line);  // 在控制台看一下消息

                Matcher packetLossMatcher = PACKET_LOSS_PATTERN.matcher(line);
                if (packetLossMatcher.find()) {
                    packetLoss = Float.parseFloat(packetLossMatcher.group(1));
                }

                Matcher packetsSentMatcher = PACKETS_SENT_PATTERN.matcher(line);
                if (packetsSentMatcher.find()) {
                    packetsSent = Integer.parseInt(packetsSentMatcher.group(1));
                }

                Matcher packetsReceivedMatcher = PACKETS_RECEIVED_PATTERN.matcher(line);
                if (packetsReceivedMatcher.find()) {
                    packetsReceived = Integer.parseInt(packetsReceivedMatcher.group(1));
                }

                Matcher pingMatcher = PING_PATTERN.matcher(line);
                while (pingMatcher.find()) {
                    float pingTime = Float.parseFloat(pingMatcher.group(1));
                    totalPingTime += pingTime;
                    minPingTime = Math.min(minPingTime, (long) pingTime);
                    maxPingTime = Math.max(maxPingTime, (long) pingTime);
                }

                // ...
            }

            // 计算平均Ping时间
            float avgPingTime = totalPingTime / (float) packetsReceived;
            
            // 如果需要可以把ms值转化为 "XX:XX:XX" 格式.
            // 例如:
            String formattedMinPingTime = formatTime(minPingTime);
            String formattedMaxPingTime = formatTime(maxPingTime);
            String formattedAvgPingTime = formatTime((long) avgPingTime);

            // ...

        } catch (IOException | InterruptedException e) {
            // 处理异常
            e.printStackTrace();
        } finally {
            // ...
        }
    }

    // ms值转换为"XX:XX:XX"格式
    private String formatTime(long milliseconds) {
        long seconds = milliseconds / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        return String.format("%02d:%02d:%02d", hours, minutes % 60, seconds % 60);
    }
}
相关推荐
zepcjsj080136 分钟前
简单实现支付密码的页面及输入效果
android
小阳睡不醒2 小时前
小白成长之路-部署Zabbix7(二)
android·运维
武子康2 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
mmoyula3 小时前
【RK3568 PWM 子系统(SG90)驱动开发详解】
android·linux·驱动开发
guts°3 小时前
17-VRRP
网络·智能路由器
Jewel Q3 小时前
动态路由协议基础
网络·智能路由器
宇称不守恒4.04 小时前
2025暑期—06神经网络-常见网络2
网络·人工智能·神经网络
Dreams_l4 小时前
网络编程2(应用层协议,传输层协议)
运维·服务器·网络
YuTaoShao4 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
数据与人工智能律师4 小时前
数字迷雾中的安全锚点:解码匿名化与假名化的法律边界与商业价值
大数据·网络·人工智能·云计算·区块链