Java怎么获取当前DNS?

HCRM技术_小炮 DNS 2025-08-11 1 0

在 Java 中,获取当前 DNS 服务器信息(如系统配置的 DNS 地址)通常需要依赖操作系统命令,因为标准 Java API 不直接提供此功能,以下是两种常用方法:

方法 1:执行系统命令(跨平台)

通过解析系统命令的输出获取 DNS 信息:

import java.io.*;
import java.util.*;
public class DNSUtil {
    public static List<String> getSystemDnsServers() throws IOException {
        String os = System.getProperty("os.name").toLowerCase();
        String command = os.contains("win") ? 
            "ipconfig /all | findstr \"DNS Servers\"" : 
            "cat /etc/resolv.conf | grep -E '^nameserver\\s+'";
        Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", command});
        try (BufferedReader reader = new BufferedReader(
             new InputStreamReader(process.getInputStream()))) {
            
            List<String> dnsServers = new ArrayList<>();
            String line;
            while ((line = reader.readLine()) != null) {
                String server = extractDnsFromLine(line, os);
                if (server != null) dnsServers.add(server);
            }
            return dnsServers;
        }
    }
    private static String extractDnsFromLine(String line, String os) {
        if (os.contains("win")) {
            // Windows 示例: "DNS Servers . . . . . : 8.8.8.8"
            int idx = line.indexOf(':');
            return (idx != -1) ? line.substring(idx + 1).trim() : null;
        } else {
            // Linux/macOS 示例: "nameserver 8.8.8.8"
            return line.replaceAll("^nameserver\\s+", "").trim();
        }
    }
    public static void main(String[] args) throws IOException {
        System.out.println("System DNS Servers: " + getSystemDnsServers());
    }
}

方法 2:使用第三方库(推荐)

使用[dnsjava](http://www.dnsjava.org/) 库获取本地 DNS 缓存(非系统配置,但反映实际使用的 DNS):

1、添加依赖(Maven):

   <dependency>
     <groupId>dnsjava</groupId>
     <artifactId>dnsjava</artifactId>
     <version>3.5.2</version>
   </dependency>

2、示例代码

   import org.xbill.DNS.Resolver;
   import org.xbill.DNS.SimpleResolver;
   import java.net.InetAddress;
   public class DnsLookup {
       public static void main(String[] args) throws Exception {
           // 获取系统默认 DNS 解析器地址
           Resolver resolver = new SimpleResolver();
           InetAddress dnsServer = ((SimpleResolver) resolver).getAddress();
           System.out.println("Active DNS Server: " + dnsServer.getHostAddress());
       }
   }

注意事项:

1、系统命令方式

局限性:依赖操作系统和语言环境(如 Windows 中文版需替换"DNS Servers""DNS 服务器")。

权限:需要允许执行系统命令。

2、dnsjava 方式

- 获取的是 JVM实际使用的 DNS 服务器(可能来自系统 DHCP 或手动配置)。

- 更可靠跨平台,但反映的是运行时解析行为,非原始系统配置。

输出示例:

- Windows:

  System DNS Servers: [192.168.1.1, 8.8.8.8]

- Linux/macOS:

  System DNS Servers: [8.8.8.8, 1.1.1.1]

根据需求选择合适方法,若需精确系统配置,方法 1 更直接;若关注运行时行为,方法 2 更可靠。

文章摘自:https://idc.huochengrm.cn/dns/12931.html

评论