通常我们以命令的方式判断远程服务器是否正常运行有两种方式,ping 或 telnet 一个远程端口。假设我们要检查的远程服务器都是 Linux 系统。
从 JDK 1.5 以后, InetAddress
类提供一个 isReachable()
方法,用来判断远程主机是否可以到达,这个方法的使用的时候一定要注意以下几点:如果客户端是 Windows 系统,JDK
不会向服务器发送 ICMP
的请求,因为 Windows 没有提供可被调用的底层接口,这时 JDK 会自动向服务器的 Port 7
发起一个 Socket 连接,如果连接也失败,则认为服务器无法到达,返回False。 注意在客户端执行此程序无须管理员用户,但要求服务器端的防火墙放行 Port 7
的访问(大部分 Linux 发行版此端口默认是禁止访问的)。
如果客户端是 Linux 系统, JDK 可以使用底层接口来向服务器发送 ICMP 请求,但执行此程序的用户必须拥有 root 权限,否则 JDK 也会像 Widnows 一样以 Socket 方式进行验证,即向服务器的 Port 7 发起一个 Socket 连接来进行判断。
如果不用 isReachable()
,比较简单的方法是 Socket
连接一个指定的端口,但前提是确定此端口可以被访问,如 Web Server
的 80 端口。这种方式对用户权限没有要求,唯一要注意的是,如果无法连接此端口,有可能只是应用服务出现问题,不一定是服务器无法连接。
private static boolean isReachable(String ip, String port, int timeout) { boolean reachable = false; // 如果端口为空,使用 isReachable 检测,非空使用 socket 检测 if(port == null) { try { InetAddress address = InetAddress.getByName(ip); reachable = address.isReachable(timeout); } catch (Exception e) { logger.error(e.getMessage()); reachable = false; } } else { Socket socket = new Socket(); try { socket.connect(new InetSocketAddress(ip, Integer.parseInt(port)), timeout); reachable = true; } catch (Exception e) { logger.error(e.getMessage()); reachable = false; } finally { try { if(socket != null) socket.close(); }catch (Exception e) {} } } return reachable; } |