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