Java 程序检查远程服务器状态

通常我们以命令的方式判断远程服务器是否正常运行有两种方式,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;

    }

你可能感兴趣的:(java)