java实现ping命令

upc 2009-06-04 01:51:35
如何用java编写程序实现发现某一网段内的活动主机
...全文
6576 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolfshouting 2010-08-18
  • 打赏
  • 举报
回复
经过我在windows xp的平台下测试,23楼和8楼的情况都行不通。但是通过cmd的方式确实是可以的。
大家考虑酌情使用!
cgaolei 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]
在 JDK 的 Document 上有些 NIO 的例子,里面有个 Ping.java,有兴趣的话可以去看看:

http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/index.html
[/Quote]

我看了一下这个官方的NIO ping的例子,并对其进行了调试和数据捕获。实际,这个官方的例子使用的方法并不是通过ICMP实现的,而是通过连接daytime端口13:

// The default daytime port
static int DAYTIME_PORT = 13;

// The port we'll actually use
static int port = DAYTIME_PORT;



try {
address = new InetSocketAddress(InetAddress.getByName(host),port);
} catch (IOException x) {
failure = x;
}


我也在Linux下使用了InetAddress.isReachable()方法做了试验:当使用普通用户时,使用的是连接echo端口7,使用root用户时,使用的是ICMP请求。通过对一台网络上的路由进行连接,两个测试结果都反回了true.

InetAddress.isReachable()通过试图连接TCP端口的方法是利用了TCP/IP协议的三次握手原理,即使对方机器在端口上没有服务,当接收到请求时会立刻拒绝,如果对方机器不在网络上则结果是超时!这个方法的实现正是利用了这一点。

总结:在使用java 1.5以上平台时,做用InetAddress.isReachable()方法是最佳的,推荐使用。
lyf_sust 2009-06-08
  • 打赏
  • 举报
回复
mark
allenaverson 2009-06-05
  • 打赏
  • 举报
回复
还可以加参数,ping的次数
dieyingao 2009-06-04
  • 打赏
  • 举报
回复
MARK一下
zhangw0322 2009-06-04
  • 打赏
  • 举报
回复
刚好有个程序给你了,呵呵
import java.io.*;

public class Ping
{
public static void main(String args[])
{
String line = null;
try
{
Process pro = Runtime.getRuntime().exec("ping 127.0.0.1 ");
BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
while ((line = buf.readLine()) != null)
System.out.println(line);
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}

}
cgaolei 2009-06-04
  • 打赏
  • 举报
回复
2楼的方法不推荐,因为是用runtime.exec来直接调用ping命令,系统平台改变时要改代码。

其次没有必要用java重新写ping,大多说人关心的是用java来检测远程主机是否可用。

我把这个写在blog里了。

http://blog.csdn.net/cgaolei/archive/2009/06/04/4240835.aspx
lulu0126 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 thc1987 的回复:]
Java codepublic static void main( String[] args )
{
StringBuffer buf = new StringBuffer();
String s = "";
Process process;
try
{
process = Runtime.getRuntime().exec( "cmd /c " + "ping 127.0.0.1" );
BufferedReader br = new BufferedReader( new InputStreamReader(
process.getInputStream() ) );
while…
[/Quote]

赞下2楼 收藏了 谢谢!
  • 打赏
  • 举报
回复
在 JDK 的 Document 上有些 NIO 的例子,里面有个 Ping.java,有兴趣的话可以去看看:

http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/index.html
lulu0126 2009-06-04
  • 打赏
  • 举报
回复
mark

学习了!
bea_java 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cgaolei 的回复:]
Java 1.5以下没有对ICMP协议的支持,需要用JNI或NIO来完成,可以Google一下。

如果用1.5以上版本,有一个简单的方法


Java code
String host = "192.168.1.181"
int timeOut = 3000;
boolean status = InetAddress.getByName(host).isReachable(timeOut);




InetAddress.isReachable()方法实现了ICMP,也就是Ping.(需要有一定的系统权限)
[/Quote]

就是这样了
oklinsong 2009-06-04
  • 打赏
  • 举报
回复
学习了。
xiaomiao13 2009-06-04
  • 打赏
  • 举报
回复
第一次听说这个,学习
afeilxc 2009-06-04
  • 打赏
  • 举报
回复
学习了!
网络科技 2009-06-04
  • 打赏
  • 举报
回复
这个不错收藏了
猿敲月下码 2009-06-04
  • 打赏
  • 举报
回复
public static void main( String[] args )
{
StringBuffer buf = new StringBuffer();
String s = "";
Process process;
try
{
process = Runtime.getRuntime().exec( "cmd /c " + "ping 127.0.0.1" );
BufferedReader br = new BufferedReader( new InputStreamReader(
process.getInputStream() ) );
while ( ( s = br.readLine() ) != null )
{
buf.append( s + "\r\n" );
}

process.waitFor();
System.out.println( buf );
} catch ( Exception ex )
{
ex.printStackTrace();
}
}
cgaolei 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jiangnaisong 的回复:]
引用 13 楼 cgaolei 的回复:
多谢11楼指教,的解没有注意到,因为只看到了API,没有看到底层实现。

请问你给出的C代码对应的java版本是多少?谢谢

答:Open JDK 1.6
[/Quote]

感谢jiangnaisong的严谨态度,学习了。

看来官方API文档还不够全面,也不能完全相信。
云上飞翔 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cgaolei 的回复:]
多谢11楼指教,的解没有注意到,因为只看到了API,没有看到底层实现。

请问你给出的C代码对应的java版本是多少?谢谢
[/Quote]
答:Open JDK 1.6
yejinson 2009-06-04
  • 打赏
  • 举报
回复
权威是正确的
qq369759459 2009-06-04
  • 打赏
  • 举报
回复
完全不懂你们在说什么。虽然学过一点JAVA不过这东西实在太高深。深受打击
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧