在开发Ping过程中,由一个小白到懵懂开发,开发出功能后总结了一下Android开发Ping时的应该要注意的。
先不说别的上代码:(要是有兴趣就往下看看Ping的参数设置,我也只懂了几个参数设置)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new NetPing().execute();
}
/**
* ping 语句传值拼接
*/
public void Ping() {
StringBuilder buffer = new StringBuilder();
String result = ""; // 结果集
Process ping;
try {
/*常用格式
ping 网址 -n 次数 -l 大小 -w 超时时间(毫秒) -t 不停运行
ping www.baidu.com -n 3 -l 32 -w 60
但是实测这样并不行,于是找了其他的方法
ping -c 3 -s 32 www.baibu.com
*/
// ping = Runtime.getRuntime().exec("ping www.baidu.com -n 3 -l 32 ");
ping = Runtime.getRuntime().exec(
"ping -c " + count + " -s " + sByte + " " + url);
int status = ping.waitFor(); // 状态
InputStream input = ping.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String line = ""; // 长度
while ((line = in.readLine()) != null) {
buffer.append(line).append("\n");
}
// 输出结果
System.out.println("============" + buffer.toString());
if (status == 0) {
result = buffer.toString();
} else {
result = "test error";
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
@SuppressLint({"WrongThread", "StaticFieldLeak"})
private class NetPing extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
Ping();
return null;
}
}
}
我再开发中用到的都在里面了。
下面是ping语言的参数设置:(cmd 输入ping 就会有ping的参数使用介绍)
C:\Users\xu>ping
用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
[-r count] [-s count] [[-j host-list] | [-k host-list]]
[-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
[-4] [-6] target_name
选项:
-t Ping 指定的主机,直到停止。
若要查看统计信息并继续操作,请键入 Ctrl+Break;
若要停止,请键入 Ctrl+C。
-a 将地址解析为主机名。
-n count 要发送的回显请求数。
-l size 发送缓冲区大小。
-f 在数据包中设置“不分段”标记(仅适用于 IPv4)。
-i TTL 生存时间。
-v TOS 服务类型(仅适用于 IPv4。该设置已被弃用,
对 IP 标头中的服务类型字段没有任何
影响)。
-r count 记录计数跃点的路由(仅适用于 IPv4)。
-s count 计数跃点的时间戳(仅适用于 IPv4)。
-j host-list 与主机列表一起使用的松散源路由(仅适用于 IPv4)。
-k host-list 与主机列表一起使用的严格源路由(仅适用于 IPv4)。
-w timeout 等待每次回复的超时时间(毫秒)。
-R 同样使用路由标头测试反向路由(仅适用于 IPv6)。
根据 RFC 5095,已弃用此路由标头。
如果使用此标头,某些系统可能丢弃
回显请求。
-S srcaddr 要使用的源地址。
-c compartment 路由隔离舱标识符。
-p Ping Hyper-V 网络虚拟化提供程序地址。
-4 强制使用 IPv4。
-6 强制使用 IPv6。
这里Android 开发常用的应该就是 -n 次数 -l 大小 -w 超时时间 ;其他的我在测试时也没测出什么所以然来,所以有兴趣的同志可以一起讨论一下:下面是我做的小测试
C:\Users\xu>ping www.baidu.com -n 3 -l 64
正在 Ping www.a.shifen.com [61.135.185.32] 具有 64 字节的数据:
来自 61.135.185.32 的回复: 字节=64 时间=15ms TTL=54
来自 61.135.185.32 的回复: 字节=64 时间=19ms TTL=54
来自 61.135.185.32 的回复: 字节=64 时间=18ms TTL=54
61.135.185.32 的 Ping 统计信息:
数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 15ms,最长 = 19ms,平均 = 17ms
C:\Users\xu>ping www.baidu.com -n 3 -l 64 -r 5
正在 Ping www.a.shifen.com [61.135.185.32] 具有 64 字节的数据:
请求超时。
请求超时。
请求超时。
61.135.185.32 的 Ping 统计信息:
数据包: 已发送 = 3,已接收 = 0,丢失 = 3 (100% 丢失)
C:\Users\xu>ping www.baidu.com -n 3 -l 64 -i 2
正在 Ping www.baidu.com [61.135.185.32] 具有 64 字节的数据:
来自 192.168.99.1 的回复: TTL 传输中过期。
来自 192.168.99.1 的回复: TTL 传输中过期。
来自 192.168.99.1 的回复: TTL 传输中过期。
61.135.185.32 的 Ping 统计信息:
数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失)
参数详解:
-t:持续ping后接的主机地址,直到ctrl+c来结束命令
-a:将地址解析为主机名
-n:后接发送的echo询问包的数目
-l:后接length,发送包含由length指定的数据量的echo数据包
-i:后接ttl值,将生存时间设置为ttl指定的值
-v:将服务类型字段设置为“tos”指定的值
-r:在“记录路由”字段中记录传出和返回数据包的路由
-s:指定“count”指定的跃点数的时间戳
-j:经过由computer-list指定的计算机列表的路由报文
-w:以毫秒为单位指定超时间隔
-4/6:强制使用ipv4/ipv6协议,后接ipv4/6地址
那么这个命令可以用来做什么呢?主要是检测网络连通性
在用ping命令之前最好用ipconfig /all命令来看一下本地网络设置
1. ping 127.0.0.1;127.0.0.1是一个回送地址,ping回送地址是为了检测本地的TCP/IP协议有没有设置好。
2. ping +本机ip;用于检测本机的IP地址是否设置有误
3. ping+本网网关;为了检测硬件设备是否有问题
4. ping+远程IP地址;用于检测本机或者本网与外网的连接是否正常
参考文献:https://blog.csdn.net/bbc955625132551/article/details/69665160
参考文献:Android:Ping命令测试网络
下一篇:Android网络测试--Traceroute