package com.example.ping;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class Ping {
private static final String TAG = "Ping";
private static Executor mExecutor = Executors.newSingleThreadExecutor();
private static int sleepTime = 200;
public interface PingCallback {
void onPingResult(List<PingResult> pingResult);
}
public static void ping(final String ipList, final PingCallback callback) {
final List<PingResult> results = new ArrayList<>();
// for (final String ip : ipList) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
PingResult pingResult = getPingResult(ipList);
results.add(pingResult);
if (callback != null)
callback.onPingResult(results);
}
});
// }
}
private static PingResult getPingResult(String host) {
return pingCmd(host, 10, 200);
}
private static PingResult pingCmd(String address, int count, int interval) {
String ip = null;
try {
ip = getIp(address);
} catch (UnknownHostException e) {
// Log.e(TAG, "parseResult", e);
}
if (ip == null) {
sleepTime = 2000;
return new PingResult("", address, "", 0);
} else {
sleepTime = 200;
}
String cmd = String.format(Locale.US, "ping -n -i %f -c %d %s", ((double) interval / 1000), count, ip);
Process process = null;
StringBuilder str = new StringBuilder();
BufferedReader reader = null;
BufferedReader errorReader = null;
try {
process = Runtime.getRuntime().exec(cmd);
reader = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
errorReader = new BufferedReader(new InputStreamReader(
process.getErrorStream()));
while ((line = reader.readLine()) != null) {
str.append(line).append("\n");
}
while ((line = errorReader.readLine()) != null) {
str.append(line);
}
} catch (IOException e) {
Log.e(TAG, "pingCmd", e);
} finally {
try {
if (reader != null) {
reader.close();
}
if (errorReader != null) {
errorReader.close();
}
if (process != null) {
process.destroy();
}
} catch (Exception e) {
Log.e(TAG, "pingCmd", e);
}
}
return new PingResult(str.toString(), address, ip, interval);
}
private static String getIp(String host) throws UnknownHostException {
InetAddress i = InetAddress.getByName(host);
if (i != null) {
return i.getHostAddress();
} else {
return null;
}
}
public static class PingResult {
public final String result;
public final String ip;
public final String address;
public final int interval;
private static final String LAST_LINE_PREFIX = "rtt min/avg/max/mdev = ";
private static final String PACKET_WORDS = " packets transmitted";
private static final String RECEIVED_WORDS = " received";
private static final String LOSS_WORDS = "% packet loss";
public int sent;
public int packetLoss = -1;
public int dropped;
public float max;
public float min;
public float avg;
public float stddev;
public int count;
public int avgNumber;
public int lostNumber;
PingResult(String result, String address, String ip, int interval) {
this.result = result;
this.ip = ip;
this.interval = interval;
this.address = address;
parseResult();
}
static String trimNoneDigital(String s) {
if (s == null || s.length() == 0) {
return "";
}
char[] v = s.toCharArray();
char[] v2 = new char[v.length];
int j = 0;
for (char aV : v) {
if ((aV >= '0' && aV <= '9') || aV == '.') {
v2[j++] = aV;
}
}
return new String(v2, 0, j);
}
private void parseRttLine(String s) {
String s2 = s.substring(LAST_LINE_PREFIX.length(), s.length() - 3);
String[] l = s2.split("/");
if (l.length != 4) {
return;
}
min = Float.parseFloat(trimNoneDigital(l[0]));
avg = Float.parseFloat(trimNoneDigital(l[1]));
max = Float.parseFloat(trimNoneDigital(l[2]));
stddev = Float.parseFloat(trimNoneDigital(l[3]));
}
private void parsePacketLine(String s) {
String[] l = s.split(",");
if (l.length != 4) {
return;
}
if (l[0].length() > PACKET_WORDS.length()) {
String s2 = l[0].substring(0, l[0].length() - PACKET_WORDS.length());
count = Integer.parseInt(s2);
}
if (l[1].length() > RECEIVED_WORDS.length()) {
String s3 = l[1].substring(0, l[1].length() - RECEIVED_WORDS.length());
sent = Integer.parseInt(s3.trim());
}
if (l[2].length() > LOSS_WORDS.length()) {
String s4 = l[2].substring(0, l[2].length() - LOSS_WORDS.length());
packetLoss = Integer.parseInt(s4.trim());
}
dropped = count - sent;
}
private void parseResult() {
String[] rs = result.split("\n");
try {
for (String s : rs) {
if (s.contains(PACKET_WORDS)) {
parsePacketLine(s);
} else if (s.contains(LAST_LINE_PREFIX)) {
parseRttLine(s);
}
}
} catch (Exception e) {
Log.e(TAG, "parseResult", e);
}
}
@Override
public String toString() {
if (avg == 1) {
avgNumber = 0;
} else if (avg > 1 && avg <= 15) {
avgNumber = 1;
} else if (avg > 15 && avg <= 55) {
avgNumber = 2;
} else if (avg > 55 && avg <= 140) {
avgNumber = 3;
} else if (avg > 140 && avg <= 420) {
avgNumber = 4;
} else if (avg > 420) {
avgNumber = 5;
} else {
avgNumber = 6;
}
if (packetLoss == 0) {
lostNumber = 0;
} else if (packetLoss > 0 && packetLoss <= 2) {
lostNumber = 1;
} else if (packetLoss > 2 && packetLoss <= 5) {
lostNumber = 2;
} else if (packetLoss > 5 && packetLoss <= 8) {
lostNumber = 3;
} else if (packetLoss > 8 && packetLoss <= 13) {
lostNumber = 4;
} else if (packetLoss > 13) {
lostNumber = 5;
} else {
lostNumber = 6;
}
Log.e("ping", "avg: " + avg + " packetLoss: " + packetLoss);
if (lostNumber > avgNumber) {
return PingQuality.getDescription(lostNumber);
} else {
return PingQuality.getDescription(av
没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
收起资源包目录
android实时网络质量检测 (262个子文件)
gradlew.bat 2KB
.gitignore 225B
.gitignore 6B
build.gradle 1KB
build.gradle 530B
settings.gradle 40B
gradlew 5KB
debug.json.html 573KB
R.txt.html 271KB
Ping.java.html.html 187KB
package-aware-r.txt.html 170KB
values.json.html 108KB
workspace.xml.html 38KB
Ping.java.html 36KB
ping.app.iml.html 26KB
manifest-merger-debug-report.txt.html 26KB
gradlew.html 22KB
ic_launcher_background.xml.html 16KB
ic_launcher_background.xml.html 16KB
values-v21.json.html 14KB
MainActivity.java.html.html 11KB
values-night-v8.json.html 9KB
values-v23.json.html 8KB
compile-file-map.properties.html 7KB
values-land.json.html 6KB
values-sw600dp-v13.json.html 5KB
values-v28.json.html 5KB
values-en-rXC.json.html 5KB
values-b+sr+Latn.json.html 5KB
values-fr-rCA.json.html 5KB
values-pt-rBR.json.html 5KB
values-pt-rPT.json.html 5KB
values-es-rUS.json.html 5KB
values-en-rGB.json.html 5KB
values-en-rIN.json.html 5KB
values-en-rAU.json.html 5KB
values-en-rCA.json.html 5KB
values-zh-rTW.json.html 5KB
values-zh-rHK.json.html 5KB
values-zh-rCN.json.html 5KB
values-lv.json.html 5KB
values-ta.json.html 5KB
values-ne.json.html 5KB
values-my.json.html 5KB
values-fr.json.html 5KB
values-lt.json.html 5KB
values-ro.json.html 5KB
values-te.json.html 5KB
values-el.json.html 5KB
values-sr.json.html 5KB
values-bg.json.html 5KB
values-ml.json.html 5KB
values-bn.json.html 5KB
values-tl.json.html 5KB
values-pt.json.html 5KB
values-de.json.html 5KB
values-kn.json.html 5KB
values-or.json.html 5KB
values-ky.json.html 5KB
values-bs.json.html 5KB
values-gl.json.html 5KB
values-mr.json.html 5KB
values-si.json.html 5KB
values-az.json.html 5KB
values-mk.json.html 5KB
values-nl.json.html 5KB
values-vi.json.html 5KB
values-in.json.html 5KB
values-ur.json.html 5KB
values-et.json.html 5KB
values-ca.json.html 5KB
values-es.json.html 5KB
values-fa.json.html 5KB
values-sk.json.html 5KB
values-it.json.html 5KB
values-hi.json.html 5KB
values-lo.json.html 5KB
values-hu.json.html 5KB
values-sv.json.html 5KB
values-ms.json.html 5KB
values-hr.json.html 5KB
values-tr.json.html 5KB
values-uk.json.html 5KB
values-ka.json.html 5KB
values-zu.json.html 5KB
values-as.json.html 5KB
values-be.json.html 5KB
values-kk.json.html 5KB
values-km.json.html 5KB
values-hy.json.html 5KB
values-sq.json.html 5KB
values-pl.json.html 5KB
values-gu.json.html 5KB
values-eu.json.html 5KB
values-sl.json.html 5KB
values-sw.json.html 5KB
values-cs.json.html 5KB
values-iw.json.html 5KB
values-pa.json.html 5KB
values-th.json.html 5KB
共 262 条
- 1
- 2
- 3
AitGo
- 粉丝: 2
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0