package com.netease.LDNetDiagnoService; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.util.Log; import com.netease.LDNetDiagnoUtils.LDPingParse; /** * 直接通过ping命令监测网络 */ public class LDNetPing { LDNetPingListener listener; // 回传ping的结果 private final int _sendCount; // 每次ping发送数据包的个数 public LDNetPing(LDNetPingListener listener, int theSendCount) { super(); this.listener = listener; this._sendCount = theSendCount; } /** * 监控NetPing的日志输出到Service * * @author panghui * */ public interface LDNetPingListener { public void OnNetPingFinished(String log); } private static final String MATCH_PING_IP = "(?<=from ).*(?=: icmp_seq=1 ttl=)"; /** * 执行ping命令,返回ping命令的全部控制台输出 * * @param ping * @return */ private String execPing(PingTask ping, boolean isNeedL) { String cmd = "ping -c "; if (isNeedL) { cmd = "ping -s 8185 -c "; } Process process = null; String str = ""; BufferedReader reader = null; try { process = Runtime.getRuntime().exec( cmd + this._sendCount + " " + ping.getHost()); reader = new BufferedReader(new InputStreamReader( process.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { str += line; } reader.close(); process.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } process.destroy(); } catch (Exception e) { } } return str; } /** * 执行指定host的traceroute * * @param host * @return */ public void exec(String host, boolean isNeedL) { PingTask pingTask = new PingTask(host); StringBuilder log = new StringBuilder(256); String status = execPing(pingTask, isNeedL); if (Pattern.compile(MATCH_PING_IP).matcher(status).find()) { Log.i("LDNetPing", "status" + status); log.append("\t" + status); } else { if (status.length() == 0) { log.append("unknown host or network error"); } else { log.append("timeout"); } } String logStr = LDPingParse.getFormattingStr(host, log.toString()); this.listener.OnNetPingFinished(logStr); } /** * Ping任务 * * @author panghui * */ private class PingTask { private String host; private static final String MATCH_PING_HOST_IP = "(?<=\\().*?(?=\\))"; public String getHost() { return host; } public PingTask(String host) { super(); this.host = host; Pattern p = Pattern.compile(MATCH_PING_HOST_IP); Matcher m = p.matcher(host); if (m.find()) { this.host = m.group(); } } } }