[Java]类似Telnet端口号判断某台服务器是否活着(连通)

2021-02-24 13点热度 0人点赞 0条评论

前言

我们程序里需要判断服务器是否能ping通,在之前的文章里,有介绍如何用程序ping服务器,详见:https://blog.terrynow.com/2020/12/28/java-ping-ip/ 不过有时候,服务器是禁ping的,我们还可以根据服务器上开通的服务(会开通对外端口号)来判断是否能连通。

实现

我有尝试过用apache commons-net的TelnetClient来检查,如下代码:

TelnetClient telnetClient = new TelnetClient();
telnetClient.setDefaultTimeout(5000);
try {
    telnetClient.connect(host, port);
    telnetClient.disconnect();
    // 到这里说明能连通
} catch (Exception e) {
    // 到这里说明不通
    e.printStackTrace();
}

但是发现个问题,有些机器上运行,无论host和端口是什么,就算不存在,也能运行到连通的代码处。

后来发现用原生的Socket就可以实现。

例如服务器有MySQL服务(3306端口)或者有FTP服务(21端口),或者其他端口基本都是可以的,通过建立Socket连接,尝试下返回结果,就可以了,详见如下代码:

/**
* 根据服务器Host和端口号,检查服务器是否ping通
* @param host IP地址或者Host
* @param port 端口号
* @return true说明能通,false不通
*/
public static boolean pingHost(String host, int port) {
    Socket pingSocket = null;
    PrintWriter out = null;
    BufferedReader br = null;
    String response = null;

    try {
        pingSocket = new Socket(host, port);
        pingSocket.setSoTimeout(5000);
        out = new PrintWriter(pingSocket.getOutputStream(), true);
        out.println("ping");
        br = new BufferedReader(new InputStreamReader(pingSocket.getInputStream(), StandardCharsets.UTF_8));

        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line).append("\n");
        }
        response = sb.toString();
    } catch (IOException ignored) {
    } finally {
        try {
            if (out != null)
                out.close();
        } catch (Exception ignored) {
        }
        try {
            if (br != null)
                br.close();
        } catch (IOException ignored) {
        }
        try {
            if (pingSocket != null)
                pingSocket.close();
        } catch (IOException ignored) {
        }
    }
//        System.out.println(response);
    return response != null;
}

 

Terry

记录开发运维过程中遇到的坑以及解决方案,干货分享

文章评论

*

code