设置DNS属性没有任何效果

3
使用Java的InetAddress.getByName()解析主机名到IP地址时,我想使用Google的DNS而不是本地系统的默认设置。根据其他stackoverflow问题以及在http://docs.oracle.com/javase/6/docs/technotes/guides/net/properties.html提供的信息,我正在使用以下内容设置相应的属性:
System.setProperty("sun.net.spi.nameservice.nameservers", "8.8.8.8");
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");

在程序后面调用System.getProperty("sun.net.spi.nameservice.nameservers")可以确认属性已设置为8.8.8.8,但网络流量明显显示所有DNS请求都发送到系统默认值,而非Google的DNS。还需要做什么来让Java使用所请求的DNS服务器呢?


1
尝试在<drive_name>\Windows\System32\drivers下的主机文件中设置sun.net.spi.nameservice.nameservers 8.8.8.8。 - M Sach
这是在 Linux 系统(Ubuntu)上运行,而不是 Windows。 - frostmatthew
3个回答

1

我遇到了类似的问题。在JVM中清除DNS服务器

我认为你的问题不是因为设置DNS属性没有效果,而是因为你在代码中设置这些参数太晚了,或者可能是在第一次网络连接之后。

尝试把它们放在

System.setProperty("sun.net.spi.nameservice.nameservers", "8.8.8.8");
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");

在你的主函数第一行告诉我。 祝你好运。

这是假的,我有一个私有 DNS,其中包含一个特定的记录:test.mytest.fr(在 Ubuntu 上安装了 BIND9)。但我的操作系统中没有进行配置。如果我在命令提示符中 ping test.mytest.fr,则无法得到答案。如果我在我的 Java 代码中设置 sun.net.spi.nameservice.nameservers 属性为我的 ubuntu 的 IP 地址,并尝试在我的 Java 代码中解析 test.mytest.fr,它将成功;如果我在 Windows 命令提示符中重试,则仍然不成功。你如何解释这个现象 :) - zeraDev
在文档(http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html)中有解释,当默认DNS无法进行查找时,它会使用您设置的任何其他提供程序(我已将相关摘录作为回答提供给您的问题)。 - frostmatthew

1

一般来说,这是您可能需要在Java之外设置的内容。JVM拥有自己的网络堆栈并行于操作系统提供的堆栈并不是很合理,因此DNS解析很可能是您需要在操作系统级别上配置的内容。

如果DNS解析是您的应用程序的核心要求,那么您实际上可能更有意义地自己进行解析,而不是通过正常的网络库(这些库将DNS解析作为正常网络操作的副作用)。我不怀疑您可以找到一个帮助您创建查找请求的库。


0

尝试在 \Windows\System32\drivers 的 host 文件中设置 sun.net.spi.nameservice.nameservers 8.8.8.8。看起来 sun.net.spi.nameservice.nameservers 已经指向了某个条目。因此,尝试将 sun.net.spi.nameservice.nameservers 8.8.8.8 设置为 host 文件的最后一个位置,因为 host 文件是解析主机名条目的第一个位置。


这是在 Linux 系统(Ubuntu)上运行,而不是 Windows。 - frostmatthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接