关闭

使用Java测试网络连通性的几种方法

发表于:2012-11-29 10:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:吴校军 刘冠群    来源:51Testing软件测试网采编

  摘要:本文列举集中典型的场景,介绍了通过Java网络编程接口判断机器之间可达性的几种方式。在实际应用中,可以根据不同的需要选择相应的方法稍加修改即可。对于更加特殊的需求,还可以考虑通过JNI的方法直接调用系统API来实现,能提供更加强大和灵活的功能。

  概述

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

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

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

  1. boolean isReachable(int timeout) // 测试地址是否可达 
  2. boolean isReachable(NetworkInterface netif, int ttl, int timeout)   
  3. // 测试地址是否可达.

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

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

  1. void isAddressAvailable(String ip){   
  2.     try{   
  3.       InetAddress address = InetAddress.getByName(ip);//ping this IP  
  4.    
  5.       if(address instanceof java.net.Inet4Address){   
  6.          System.out.println(ip + " is ipv4 address");   
  7.       }else 
  8.         if(address instanceof java.net.Inet6Address){   
  9.          System.out.println(ip + " is ipv6 address");   
  10.       }else{   
  11.          System.out.println(ip + " is unrecongized");   
  12.       }   
  13.    
  14.       if(address.isReachable(5000)){   
  15.           System.out.println("SUCCESS - ping " + IP + " with no interface specified");   
  16.       }else{   
  17.          System.out.println("FAILURE - ping " + IP + " with no interface specified");   
  18.       }   
  19.    
  20.       System.out.println("\n-------Trying different interfaces--------\n");   
  21.    
  22.       Enumeration<NetworkInterface> netInterfaces =   
  23.             NetworkInterface.getNetworkInterfaces();      
  24.       while(netInterfaces.hasMoreElements()) {      
  25.            NetworkInterface ni = netInterfaces.nextElement();      
  26.            System.out.println(  
  27. "Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName());  
  28.      if(address.isReachable(ni, 05000)){   
  29.           System.out.println("SUCCESS - ping " + ip);   
  30.       }else{   
  31.           System.out.println("FAILURE - ping " + ip);   
  32.       }   
  33.    
  34.       Enumeration<InetAddress> ips = ni.getInetAddresses();      
  35.       while(ips.hasMoreElements()) {      
  36.           System.out.println("IP: " + ips.nextElement().getHostAddress());     
  37.       }   
  38.       System.out.println("-------------------------------------------");   
  39.       }   
  40.         }catch(Exception e){   
  41.       System.out.println("error occurs.");   
  42.       e.printStackTrace();   
  43.         }         
  44.  }

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号