前言
我们程序里需要判断服务器是否能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; }
文章评论