首页 > 编程 > Java > 正文

java如何测试网络连通性

2019-11-26 13:39:53
字体:
来源:转载
供稿:网友

本文实例为大家分享了Java测试网络连通性的方法,供大家参考,具体内容如下

第一种方式:利用java运行时:
Java代码

 /** * test network * @param ip */private void getNetworkState(String ip) {  Runtime runtime = Runtime.getRuntime();  try {    log.info("=================正在测试网络连通性ip:"+ip);    Process process = runtime.exec("ping " +ip);    InputStream iStream = process.getInputStream();    InputStreamReader iSReader = new InputStreamReader(iStream,"UTF-8");    BufferedReader bReader = new BufferedReader(iSReader);    String line = null;    StringBuffer sb = new StringBuffer();    while ((line = bReader.readLine()) != null) {      sb.append(line);    }    iStream.close();    iSReader.close();    bReader.close();    String result = new String(sb.toString().getBytes("UTF-8"));    log.info("ping result:"+result);    if (!StringUtils.isBlank(result)) {      if (result.indexOf("TTL") > 0 || result.indexOf("ttl") > 0) {        log.info("网络正常,时间: " + TimeUtil.getCurDate("yyyy-mm-dd hh:mm:ss"));           } else {        log.info("网络断开,时间 :" + TimeUtil.getCurDate("yyyy-mm-dd hh:mm:ss"));      }    }  } catch (Exception e) {    log.error("网络异常:"+e.getMessage());    e.printStackTrace();  }}

在windows平台上,上面代码没有为,ping ip 会结束,而在linux环境中ping命令,ping不通时,
会卡住,ping通,会不定的输出信息,考虑用另一种方式socket。

第二种方式socket:
Java代码

package com.util.network;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.NetworkInterface;import java.net.Socket;import java.net.SocketAddress;import java.net.SocketException;import java.net.UnknownHostException;import java.util.Enumeration;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 测试网络连通性 *  * @author donald *  */public class NetworkHelper {  private static Logger log = LoggerFactory.getLogger(NetworkHelper.class);  private static NetworkHelper instance = null;  public static synchronized NetworkHelper getInstance(){    if(instance == null){      instance = new NetworkHelper();    }    return instance;  }  /**   * 测试本地能否ping ip   *    * @param ip   * @return   */  public boolean isReachIp(String ip) {    boolean isReach = false;    try {      InetAddress address = InetAddress.getByName(ip);// ping this IP      if (address instanceof java.net.Inet4Address) {        log.info(ip + " is ipv4 address");      } else if (address instanceof java.net.Inet6Address) {        log.info(ip + " is ipv6 address");      } else {        log.info(ip + " is unrecongized");      }      if (address.isReachable(5000)) {        isReach = true;        log.info("SUCCESS - ping " + ip            + " with no interface specified");      } else {        isReach = false;        log.info("FAILURE - ping " + ip            + " with no interface specified");      }    } catch (Exception e) {      log.error("error occurs:" + e.getMessage());    }    return isReach;  }  /**   * 测试本地所有的网卡地址都能ping通 ip   *    * @param ip   * @return   */  public boolean isReachNetworkInterfaces(String ip) {    boolean isReach = false;    try {      InetAddress address = InetAddress.getByName(ip);// ping this IP      if (address instanceof java.net.Inet4Address) {        log.info(ip + " is ipv4 address");      } else if (address instanceof java.net.Inet6Address) {        log.info(ip + " is ipv6 address");      } else {        log.info(ip + " is unrecongized");      }      if (address.isReachable(5000)) {        isReach = true;        log.info("SUCCESS - ping " + ip            + " with no interface specified");      } else {        isReach = false;        log.info("FAILURE - ping " + ip            + " with no interface specified");      }      if (isReach) {        log.info("-------Trying different interfaces--------");        Enumeration<NetworkInterface> netInterfaces = NetworkInterface            .getNetworkInterfaces();        while (netInterfaces.hasMoreElements()) {          NetworkInterface ni = netInterfaces.nextElement();          log.info("Checking interface, DisplayName:"              + ni.getDisplayName() + ", Name:" + ni.getName());          if (address.isReachable(ni, 0, 5000)) {            isReach = true;            log.info("SUCCESS - ping " + ip);          } else {            isReach = false;            log.info("FAILURE - ping " + ip);          }          Enumeration<InetAddress> ips = ni.getInetAddresses();          while (ips.hasMoreElements()) {            log.info("IP: " + ips.nextElement().getHostAddress());          }          log.info("-----------------check now NetworkInterface is done--------------------------");        }      }    } catch (Exception e) {      log.error("error occurs:" + e.getMessage());    }    return isReach;  }  /**   * 获取能与远程主机指定端口建立连接的本机ip地址   * @param remoteAddr   * @param port   * @return   */  public String getReachableIP(InetAddress remoteAddr, int port) {    String retIP = null;    Enumeration<NetworkInterface> netInterfaces;    try {      netInterfaces = NetworkInterface.getNetworkInterfaces();      while (netInterfaces.hasMoreElements()) {        NetworkInterface ni = netInterfaces.nextElement();        Enumeration<InetAddress> localAddrs = ni.getInetAddresses();        while (localAddrs.hasMoreElements()) {          InetAddress localAddr = localAddrs.nextElement();          if (isReachable(localAddr, remoteAddr, port, 5000)) {            retIP = localAddr.getHostAddress();            break;          }        }      }    } catch (SocketException e) {      log.error("Error occurred while listing all the local network addresses:"          + e.getMessage());    }    if (retIP == null) {      log.info("NULL reachable local IP is found!");    } else {      log.info("Reachable local IP is found, it is " + retIP);    }    return retIP;  }  /**   * 获取能与远程主机指定端口建立连接的本机ip地址   * @param remoteIp   * @param port   * @return   */  public String getReachableIP(String remoteIp, int port) {    String retIP = null;    InetAddress remoteAddr = null;    Enumeration<NetworkInterface> netInterfaces;    try {      remoteAddr = InetAddress.getByName(remoteIp);      netInterfaces = NetworkInterface.getNetworkInterfaces();      while (netInterfaces.hasMoreElements()) {        NetworkInterface ni = netInterfaces.nextElement();        Enumeration<InetAddress> localAddrs = ni.getInetAddresses();        while (localAddrs.hasMoreElements()) {          InetAddress localAddr = localAddrs.nextElement();          if (isReachable(localAddr, remoteAddr, port, 5000)) {            retIP = localAddr.getHostAddress();            break;          }        }      }    } catch (UnknownHostException e) {      log.error("Error occurred while listing all the local network addresses:"+ e.getMessage());    }catch (SocketException e) {      log.error("Error occurred while listing all the local network addresses:"+ e.getMessage());    }    if (retIP == null) {      log.info("NULL reachable local IP is found!");    } else {      log.info("Reachable local IP is found, it is " + retIP);    }    return retIP;  }  /**   * 测试localInetAddr能否与远程的主机指定端口建立连接相连   *    * @param localInetAddr   * @param remoteInetAddr   * @param port   * @param timeout   * @return   */  public boolean isReachable(InetAddress localInetAddr,      InetAddress remoteInetAddr, int port, int timeout) {    boolean isReachable = false;    Socket socket = null;    try {      socket = new Socket();      // 端口号设置为 0 表示在本地挑选一个可用端口进行连接      SocketAddress localSocketAddr = new InetSocketAddress(          localInetAddr, 0);      socket.bind(localSocketAddr);      InetSocketAddress endpointSocketAddr = new InetSocketAddress(          remoteInetAddr, port);      socket.connect(endpointSocketAddr, timeout);      log.info("SUCCESS - connection established! Local: "          + localInetAddr.getHostAddress() + " remote: "          + remoteInetAddr.getHostAddress() + " port" + port);      isReachable = true;    } catch (IOException e) {      log.error("FAILRE - CAN not connect! Local: "          + localInetAddr.getHostAddress() + " remote: "          + remoteInetAddr.getHostAddress() + " port" + port);    } finally {      if (socket != null) {        try {          socket.close();        } catch (IOException e) {          log.error("Error occurred while closing socket:"              + e.getMessage());        }      }    }    return isReachable;  }  /**   * 测试localIp能否与远程的主机指定端口建立连接相连   *    * @param localIp   * @param remoteIp   * @param port   * @param timeout   * @return   */  public boolean isReachable(String localIp, String remoteIp,      int port, int timeout) {    boolean isReachable = false;    Socket socket = null;    InetAddress localInetAddr = null;    InetAddress remoteInetAddr = null;    try {      localInetAddr = InetAddress.getByName(localIp);      remoteInetAddr = InetAddress.getByName(remoteIp);      socket = new Socket();      // 端口号设置为 0 表示在本地挑选一个可用端口进行连接      SocketAddress localSocketAddr = new InetSocketAddress(          localInetAddr, 0);      socket.bind(localSocketAddr);      InetSocketAddress endpointSocketAddr = new InetSocketAddress(          remoteInetAddr, port);      socket.connect(endpointSocketAddr, timeout);      log.info("SUCCESS - connection established! Local: "          + localInetAddr.getHostAddress() + " remote: "          + remoteInetAddr.getHostAddress() + " port" + port);      isReachable = true;    } catch (IOException e) {      log.error("FAILRE - CAN not connect! Local: "          + localInetAddr.getHostAddress() + " remote: "          + remoteInetAddr.getHostAddress() + " port" + port);    } finally {      if (socket != null) {        try {          socket.close();        } catch (IOException e) {          log.error("Error occurred while closing socket:"              + e.getMessage());        }      }    }    return isReachable;  }  public static void main(String[] args) {     if(NetworkHelper.getInstance().isReachIp("192.168.126.128")){       log.info("=======本机可以ping通ip:"+"192.168.126.128");     }     else{       log.info("=======本机ping不通ip:"+"192.168.126.128");     }     if(NetworkHelper.getInstance().isReachNetworkInterfaces("192.168.126.128")){       log.info("=======本机所有网卡可以ping通ip:"+"192.168.126.128");     }     else{       log.info("=======本机所有网卡ping不通ip:"+"192.168.126.128");     }     String localIp = NetworkHelper.getInstance().getReachableIP("192.168.126.128",8081);     if(!StringUtils.isBlank(localIp)){       log.info("=======本机可以与ip:"+"192.168.126.128"+",port:"+8081+"建立连接的IP:"+localIp);     }     else{       log.info("=======本机不能与ip:"+"192.168.126.128"+",port:"+8081+"建立连接的IP");     }  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表