先上结论:通过调用系统自带的Ping命令来实现,使用exitValue()值来判断Ping的结果。按照惯例,0表示ok,1表示不通。
代码:
private static void pingTest() throws Exception
{
String[] ipStrings = {
"127.0.0.1",
"10.0.0.1",
"8.8.8.8",
"10.0.0.2",
"114.114.114.114",
"114.114.114.11",
"114.114.114.114"};
String line = null;
for (String ip : ipStrings)
{
Process pro = Runtime.getRuntime().exec("ping " + ip + " -n 1 -w 50");
BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while((line = buf.readLine()) != null)
System.out.println(line);
pro.waitFor();
System.out.println(ip + " : " + pro.exitValue());
}
}
解析:
1.Ping就是一个exe,因此命令中无需加上cmd;测试发现,前面加了cmd与cmd /k 效果一样,Ping执行完毕后cmd进程并不会自动结束,导致java程序无法自动结束;
2.对于Ping结果的判断,测试发现无法像批处理一样通过读取系统的errorlevel来实现。首先该值既不是系统环境变量,也不是系统属性,无法通过java内置的函数来获取;只能将"echo %errorlevel%"作为一条cmd命令,当然前面还要加上“cmd /c”的前缀;测试中发现,无论Ping通与否,程序读取到的errorlevel值都为0.
网上给出的其他方法分析
1.isReachable(int timeout)
乍一看这个方法真方便,实际上该方法在windows平台下不太实用。首先,在Win7 64位系统下测试结果:对任何主机均返回false。 javadoc写道,如果能够获得特权,它将使用ICMP来实现,否则使用TCP端口7(注:echo)来实现。然而windows主机一般是不会开启该端口的。搜索到有一老外的Blog说在linux下通过配置java虚拟机来让其获得权限从而使用ICMP,他也表示不知道在windows下如何解决。还看到一个Blog上写道将timeout设置到非常大的数字可保证准确的结果,然而我实测无效。
2.有人提到了一个实现了Ping.Class的NIO:
http://docs.oracle.com/javase/1.5.0/docs/guide/nio/example/Ping.java
查看源码发现它是通过Socket连接目标的13端口,那么很明显该方法也不行。
3.使用Socket构造ICMP报文
这个应该是可行的,只不过基本上就是一个堆积字节数组的过程,比较麻烦。因此这显然不是最佳方案啦~
分享到:
相关推荐
### 使用Java实现Ping的多种方法 在日常网络管理和软件开发中,经常需要检查网络连通性。`ping`命令作为一种简单而有效的工具被广泛应用于这一领域。本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一...
### Java实现的模拟Ping功能详解 #### 一、概述 在计算机网络中,Ping命令是一种常用的测试工具,用于检查网络连接是否可用,并测量与远程主机的往返时间。本篇文章将详细解析一个用Java语言编写的模拟Ping功能的...
在Java中,由于Java标准库不直接支持ICMP协议,所以不能直接使用Java的Socket API来实现ping。但是,可以通过以下两种方式来模拟ping操作: 1. **使用Raw Socket**:Java的`java.net.Socket`类并不允许直接创建ICMP...
Java实现ping功能主要是通过调用操作系统命令,也可以使用高级库如Mina进行自定义网络通信。同时,通过线程池可以并发处理多个ping任务,提高效率。告警机制则可以根据实际情况选择合适的方式实现,确保及时响应系统...
标题 "java_icmp_ping" 涉及到的是一个使用Java编程语言开发的项目,它实现了基于ICMP(Internet Control Message Protocol,互联网控制消息协议)的“ping”功能,类似于我们在Windows系统中使用的命令行工具“ping...
对于C#开发者来说,虽然核心讨论的是Java实现,但了解如何在C#中实现类似功能也是有益的。在C#中,虽然没有内置的`ping`和`traceroute`实现,但可以使用P/Invoke技术调用Windows API来完成这些任务。例如,可以调用`...
Android系统中实现ping功能是 Android开发中的一项重要任务,本文将详细介绍 Android中实现ping功能的多种方法。 方法一:使用InetAddresss方式 从Java 1.5开始,java.net包中就实现了ICMP ping的功能。使用时应...
在Windows操作系统中,网络诊断工具`ping`是一个非常基础且重要的功能,用于测试网络连通性。本项目实现了将`ping`功能用C语言编写并封装成动态链接库(DLL),以便于Java程序直接调用,从而在Java环境中实现网络...
本文将深入探讨如何使用套接字(Sockets)实现ping功能,这对于理解网络编程和ICMP(Internet Control Message Protocol)协议至关重要。 首先,让我们了解什么是ping。Ping是基于ICMP协议的一个应用,其主要功能是...
- **编程语言**:可能使用Python、C#、Java等编程语言来编写,这些语言都提供了方便的套接字库来发送和接收ICMP数据包。 - **命令行接口**:软件可能有一个用户友好的界面,允许用户输入参数,如IP地址、间隔时间、...
3. **ping命令的使用**:在C++中,可以使用系统调用(如`system()`函数)来执行ping命令,获取ping的结果,包括响应时间。 4. **IP地址处理**:代码需要解析文件中的IP地址并转换为适合网络通信的格式,这可能涉及...
对于Windows系统,可以使用WinPCap或Pcap.NET库,它们提供了底层网络访问接口。而在Unix/Linux系统中,可能需要使用root权限并直接操作网络内核模块,因为ICMP通常是操作系统级别的。 2. **ICMP报文构造**:创建...
总结起来,这个项目是一个使用Java实现的UDP通信实验,旨在模拟ping操作,但不依赖于系统自带的ping命令。它包括客户端和服务器端两部分,通过自定义的端口3109进行通信,主要用于教育目的,帮助学生理解UDP协议的...
2. 程序实现:在Windows环境下,使用C++或者其他支持Socket编程的语言实现PING程序。程序运行时,用户需要在命令行界面输入目标主机的IP地址,程序将发送ICMP回送请求,并等待回送应答。 3. 功能要求:当输入IP地址...
本指南将详细介绍从A到Z的Windows系统命令,帮助你提升在Windows环境中的操作效率。 A - assoc:关联文件扩展名 assoc命令用于查看或更改文件扩展名与特定程序之间的关联。例如,assoc .txt=Notepad.exe可以将.txt...
标题 "C语言实现CMD中的ping" 指的是使用C编程语言来编写一个模拟Windows命令行工具CMD中`ping`命令的程序。`ping`命令是网络诊断中常用的一个工具,用于测试网络连接并测量数据包从源主机到目标主机的往返时间。在...
Android系统虽然不像Linux或Windows那样直接提供命令行工具,但我们可以利用Java的Socket编程来实现类似的功能。下面将详细探讨如何在Android应用中实现ping IP地址,并获取响应速度。 首先,理解ping的基本原理。...