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;
    }

posted on 2013-06-27 06:19  Step-BY-Step  阅读(3046)  评论(0编辑  收藏  举报

导航