Java程序中如何ping一个域名是否有效
最近在做一个监控平台,需要保障监控中心本身的存活,设置一个监测程序来ping一下是最简单高效的办法之一。在Java程序中判断一个域名是否有效(即能否ping通),可以通过两种常用方式实现:利用InetAddress类的isReachable方法(跨平台基础实现)或执行系统原生ping命令(更贴近系统级ping的结果)。以下是具体实现及说明:
v方法一:使用InetAddress.isReachable()(简单跨平台)
java.net.InetAddress类提供了isReachable(int timeout)方法,可尝试通过网络连接目标地址,超时时间内成功则返回true。其底层实现可能依赖ICMP协议(类似ping)或TCP连接(尝试连接端口 7,echo服务),适用于大多数基础场景。
import java.net.InetAddress; import java.net.UnknownHostException; public class PingDomain { public static void main(String[] args) { String domain = "www.baidu.com"; // 要ping的域名 int timeout = 3000; // 超时时间(毫秒) try { // 通过域名获取InetAddress对象(解析IP) InetAddress address = InetAddress.getByName(domain); // 判断是否可达 boolean isReachable = address.isReachable(timeout); if (isReachable) { System.out.println("域名 " + domain + " 有效,IP:" + address.getHostAddress()); } else { System.out.println("域名 " + domain + " 不可达(可能超时或网络问题)"); } } catch (UnknownHostException e) { // 域名无法解析(如不存在的域名) System.out.println("域名 " + domain + " 无效(无法解析IP):" + e.getMessage()); } catch (Exception e) { // 其他异常(如网络权限问题) System.out.println("ping失败:" + e.getMessage()); } } }
特点:
v方法二:执行系统原生ping命令(更准确)
直接调用操作系统的ping命令(Windows:ping -n 1 域名;Linux/Mac:ping -c 1 域名),通过命令返回结果判断是否有效。这种方式完全模拟系统终端的ping行为,结果更可靠。
import java.io.BufferedReader; import java.io.InputStreamReader; public class PingBySystemCommand { public static void main(String[] args) { String domain = "www.google.com"; // 要ping的域名 int pingCount = 1; // 发送1个ping包 boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win"); // 构建ping命令(Windows和Linux命令参数不同) String[] command = isWindows ? new String[]{"cmd", "/c", "ping -n " + pingCount + " " + domain} : new String[]{"/bin/sh", "-c", "ping -c " + pingCount + " " + domain}; try { // 执行系统命令 Process process = Runtime.getRuntime().exec(command); // 等待命令执行完成(0表示成功,非0表示失败) int exitCode = process.waitFor(); // 读取命令输出(可选,用于调试) BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream(), "GBK") // Windows默认GBK编码 ); String line; System.out.println("ping输出:"); while ((line = reader.readLine()) != null) { System.out.println(line); } if (exitCode == 0) { System.out.println("\n域名 " + domain + " 有效(ping成功)"); } else { System.out.println("\n域名 " + domain + " 无效(ping失败)"); } } catch (Exception e) { System.out.println("执行ping命令失败:" + e.getMessage()); } } }
特点:
关键说明:
总结推荐:
v源码地址
https://github.com/toutouge/javademosecond
作 者:请叫我头头哥
出 处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!



浙公网安备 33010602011771号