java实现ping命令

upc 2009-06-04 01:51:35
如何用java编写程序实现发现某一网段内的活动主机
...全文
6577 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)
课程简介:Re:《 Linux 网络管理命令 》  ---------------------------------------内容提要: 01/22)命令 ifconfig:配置或显示网络接口信息02/22)命令 ifup:激活网络接口03/22)命令 ifdown:禁用网络接口04/22)命令 route:显示或管理路由表05/22)命令 arp:管理系统的arp缓存06/22)命令 ip:网络配置工具07/22)命令 netstat:查看网络状态08/22)命令 ss:查看网络状态09/22)命令 ping:测试主机之间网络的连通性10/22)命令 traceroute:追踪数据转发路由状况11/22)命令 arping:发送arp请求12/22)命令 telnet:远程登录主机13/22)命令 nc:多功能网络工具14/22)命令 ssh:协议详解15/22)命令 wget:命令行下载工具16/22)命令 mailq:显示邮件传输队列17/22)命令 mail:发送和接收邮件18/22)命令 nslookup:域名查询工具19/22)命令 dig:域名查询工具20/22)命令 host :域名查询工具21/22)命令 nmap:网络探测工具和安全/端口扫描器22/22)命令 tcpdump:监听网络流量            本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。       对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。       研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功!       本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。       本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述!     《参透 VMware 桌面级虚拟化》    《在虚拟机中安装模版机(包括应用软件等)》    《SecureCRT 连接 GNS3/Linux 的安全精密工具》  

62,614

社区成员

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

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