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 小时前
基于Java的火车票订票系统的设计与开发
java·开发语言
黎雁·泠崖3 小时前
Java核心基础API学习总结:从Object到包装类的核心知识体系
java·开发语言·学习
Yvonne爱编码3 小时前
JAVA数据结构 DAY1-集合和时空复杂度
java·数据结构·python
win x4 小时前
JavaSE(基础)高频面试点及 知识点
java·面试·职场和发展
Terio_my4 小时前
简要 Java 面试题学习
java·开发语言·学习
毕设源码-朱学姐4 小时前
【开题答辩全过程】以 基于安卓的教师上课辅助系统为例,包含答辩的问题和答案
android
好好研究4 小时前
Spring Boot - Thymeleaf模板引擎
java·spring boot·后端·thymeleaf
爬山算法4 小时前
Hibernate(76)如何在混合持久化环境中使用Hibernate?
java·后端·hibernate
编程彩机4 小时前
互联网大厂Java面试:从分布式缓存到消息队列的技术场景解析
java·redis·面试·kafka·消息队列·微服务架构·分布式缓存
她说..4 小时前
策略模式+工厂模式实现单接口适配多审核节点
java·spring boot·后端·spring·简单工厂模式·策略模式