使用Java类库判断两台机器之间网络是否可达

在网络编程中,有时我们需要判断两台机器之间的连通性,或者说是一台机器到另一台机器的网络可达性。在系统层面的测试中,我们常常用 Ping 命令来做验证。尽管 Java 提供了比较丰富的网络编程类库(包括在应用层的基于 URL 的网络资源读取,基于 ">TCP/IP 层的 Socket 编程,以及一些辅助的类库),但是没有直接提供类似 Ping 命令来测试网络连通性的方法。本文将介绍如何通过 Java 已有的 API,编程实现各种场景下两台机器之间的网络可达性判断。在下面的章节中,我们会使用 Java 网络编程的一些类库 java.net.InetAddress 和 java.net.Socket,通过例子解释如何模拟 Ping 命令。

简单判断两台机器的可达性

一般情况下,我们仅仅需要判断从一台机器是否可以访问(Ping)到另一台机器,此时,可以简单的使用 Java 类库中 java.net.InetAddress 类来实现,这个类提供了两个方法探测远程机器是否可达

boolean isR
eachable(int timeout) // 测试地址是否可达 boolean isReachable(Network
Interface netif, int ttl, int timeout) // 测试地址是否可达.

简单说来,上述方法就是通过远端机器的 IP 地址构造 InetAddress 对象,然后调用其 isReachable 方法,测试调用机器和远端机器的网络可达性。注意到远端机器可能有多个 IP 地址,因而可能要迭代的测试所有的情况。

清单 1:简单判断两台机器的可达性

void isAddressAvailable(String ip){ try{ InetAddress address = InetAddress.getByName(ip);//ping this IP if(address instanceof java.net.Inet4Address){ System.out.println(ip + " is ipv4 address"); }else if(address instanceof java.net.Inet6Address){ System.out.println(ip + " is ipv6 address"); }else{ System.out.println(ip + " is unrecongized"); } if(address.isReachable(5000)){ System.out.println("SUCCESS - ping " + IP + " with no interface specified"); }else{ System.out.println("FAILURE - ping " + IP + " with no interface specified"); } System.out.println("\n-------Tr
ying different interfaces--------\n"); Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); System.out.println("Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName()); if(address.isReachable(ni, 0, 5000)){ System.out.println("SUCCESS - ping " + ip); }else{ System.out.println("FAILURE - ping " + ip); } Enumeration<InetAddress> ips = ni.getInetAddresses(); while(ips.hasMoreElements()) { System.out.println("IP: " + ips.nextElement().getHostAddress()); } System.out.println("-------------------------------------------"); } }catch(Exception e){ System.out.println("error occurs."); e.printStackTrace(); } }

时间: 2024-10-02 07:40:16

使用Java类库判断两台机器之间网络是否可达的相关文章

网络-使用ping命令,如何判断两台机器是否在一个子网

问题描述 使用ping命令,如何判断两台机器是否在一个子网 例如:IP为192.168.1.3的主机ping主机IP为192.168.1.4的主机,可通过本机IP以及子网掩码计算出所属子网,那么被ping的主机只有IP,那怎么判断是否一个子网呢?什么协议规范了这个事情?不懂网络,请教下,呵呵~ 解决方案 ping是ICMP协议,在路由协议之下,交换机,hub等会做数据包转发,根据ip地址得到mac来进行数据传输

Muduo 网络编程示例(五)测量两台机器的网络延迟

本文介绍一个简单的网络程序 roundtrip,用于测量两台机器之间的网络延迟,即"往返时间 / round trip time / RTT".这篇文章主要考察定长 TCP 消息的分包,TCP_NODELAY 的作用. 本文的代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/roundtrip/roundtrip.cc 测量 RTT 的办法很简单: host A 发一条消息给 host B,其中包含 host

局域网-java多播MuticastSocket两台计算机通信失败

问题描述 java多播MuticastSocket两台计算机通信失败 请大家帮忙看下,我用的是java的多播在两台计算机之间传送数据.校园网一台计算机通过有线移动拨号上网,再通过360WIFI连接另一台计算机.前者的IP地址是(1)无线局域网IP地址:192.168.253.1(2)以太网IP地址:192.168.1.102(3)PPP 适配器SRun3K专用宽带拨号连接IP地址:10.126.254.64.后者的IP地址只有无线局域网IP地址:192.168.253.7.多播的代码如下,一台计

python实现简单socket程序在两台电脑之间传输消息的方法_python

本文实例讲述了python实现简单socket程序在两台电脑之间传输消息的方法.分享给大家供大家参考.具体分析如下: python开发简单socket程序在两台电脑之间传输消息,分为客户端和服务端,分别在两台电脑上运行后即可进行简单的消息传输,也可以在一台电脑上测试,设置两个不同的端口即可. # Save as server.py 服务端代码 # Message Receiver import os from socket import * host = "" port = 13000

路径-各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么

问题描述 各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么 各位android的高手,请问怎么得到,判断一台机器上usb盘的目录是什么 或者怎么判断一个路径是不是usb盘的 一个实例如下(我现在的一个android设备现状): 1,有内部存储器sdcard,具体路径:/mnt/sdcard 2,有tf卡,具体路径:/mnt/ext_sd 3,有u盘,具体路径:/mnt/usbhost1 我可以得到/mnt/usbhost1,并且确定其是u盘的路径 但是其他设备不一定会和

阿里云-两台机器的mysql数据同步

问题描述 两台机器的mysql数据同步 阿里云的云服务有提供数据同步吗?例如是把云服务器的数据库数据实时同步到本地数据库,不使用程序或软件.就是实现两个Mysql数据库之间的主从同步,主数据库是阿里云的mysql数据库. 解决方案 可以做个订阅与发布,实现主从同步.

java网络编程-java socket实现两台电脑通信

问题描述 java socket实现两台电脑通信 大学生 菜鸟一个 现在自己电脑创了 发送端,接收端,可行 然后同样的代码,将发送端目的ip改为宿舍一台电脑ip,就没反应了.怎么回事啊? 防火墙吗?还是ip地址不对.两台机一个网,一个是192.168.1.102,一台是103 解决方案 没反应是什么意思,指发送端? 解决方案二: 原因很多..硬件软件的可能性都有. 都会在中间阻止或者消亡http请求..最好把你的代码,和网络环境说一下. 解决方案三: 端口看看有没有被占用吧 解决方案四: 试试

php判断两个日期之间相差多少个月份的方法_php技巧

本文实例讲述了php判断两个日期之间相差多少个月份的方法.分享给大家供大家参考.具体实现方法如下: /** * @author injection(injection.mail@gmail.com) * @var date1日期1 * @var date2 日期2 * @var tags 年月日之间的分隔符标记,默认为'-' * @return 相差的月份数量 * @example: $date1 = "2003-08-11"; $date2 = "2008-11-06&qu

如何判断两台机子是否在同一局域网?真急啊!

问题描述 网上看到,用两台机子的本地IP和子网掩码相与,结果相同时说明在同一网段,但实际这个判断是不对的,我用两台确实不在同一局域网的机子测式,获取的结果是在同一网段,不知有没有正确的方法来判断是否在同一局域网.实在谢谢了!! 解决方案 解决方案二:应该没有办法判断,尤其是通过程序判断.解决方案三:好像没有呢....不知判断DNS是否可以?解决方案四:首先你两台机是不是通过一个路由器连接的,如果是,那通过子网掩码判断是没错的解决方案五:程序判断没有通用的方法吗?如果不判断同局域网的udp打洞能成