基于resolv.conf的Java动态更改DNS服务器

基于resolv.conf的Java动态更改DNS服务器,java,dns,Java,Dns,在需求中,/etc/resolv.conf将由其他系统修改。例如,first resolv.conf是1.1.1.1 nameserver 1.1.1.1 Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); DirContext ictx = new InitialDirContext(env); String dnsS

在需求中,/etc/resolv.conf将由其他系统修改。例如,first resolv.conf是1.1.1.1

nameserver 1.1.1.1
Hashtable env =  new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
DirContext ictx = new InitialDirContext(env);
String dnsServers = (String) ictx.getEnvironment().get("java.naming.provider.url");
System.out.println(dnsServers); 
事实上,此DNS服务器无法解析url

InetAddress addr1 = InetAddress.getByName("www.google.com");
System.out.println(addr1.getHostAddress());
它将抛出异常

java.net.UnknownHostException: www.google.com: unknown error
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276)
    at java.net.InetAddress.getAllByName(InetAddress.java:1192)
    at java.net.InetAddress.getAllByName(InetAddress.java:1126)
    at java.net.InetAddress.getByName(InetAddress.java:1076)
其次,我们将/etc/resolv.conf修改为普通dns服务器

nameserver 8.8.8.8
继续使用代码连接到url

InetAddress addr2 = InetAddress.getByName("www.google.com");
System.out.println(addr2.getHostAddress());
但它仍然抛出如上所述的异常

我尝试使用jndi让DNS服务器在Java中使用,发现下面的change resolv.conf和change之后的dnsServer都是1.1.1.1

nameserver 1.1.1.1
Hashtable env =  new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
DirContext ictx = new InitialDirContext(env);
String dnsServers = (String) ictx.getEnvironment().get("java.naming.provider.url");
System.out.println(dnsServers); 

那么JVM如何基于Linux系统动态地使用dns服务器呢?

IIRC只是更改/etc/reolv.conf并不重新加载它什么是IIRC,你的意思是Linux需要重新加载/etc/resolv.conf,在更改IIRC之后-如果我没记错的话,你的意思是Linux需要重新加载/etc/resolv.conf,在更改之后-是的,或者我认为在更改这个文件之后,我尝试过nslookup这个url,它成功地获取了IP,但是在运行Java时,它无法获取。IIRC只是更改/etc/reolv.conf并不会重新加载它什么是IIRC,你的意思是linux需要重新加载/etc/resolv.conf,在更改IIRC之后-如果我没记错的话,你的意思是linux需要重新加载/etc/resolv.conf,更改后-是的,我认为更改此文件后,我已尝试查找此url,它已成功获取IP,但在运行Java时,它无法获取。