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);
    }
}
相关推荐
花花无缺3 分钟前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart1 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP2 小时前
MyBatis-mybatis入门与增删改查
java
孟陬6 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌6 小时前
一站式了解四种限流算法
java·后端·go
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
华仔啊6 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
也些宝7 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java