Java 如何测试给定的主机名是否确实存在?

Java 如何测试给定的主机名是否确实存在?,java,dns,Java,Dns,如何测试给定的主机名是否真的存在于Java中 问题在于某些DNS服务,如Opendns,即使不存在DNS条目,也会返回IP地址,因此,InetAddress.getByName(主机)将始终返回某些内容 但是,host命令能够以某种方式检测到它: ~$ host owqieyuqowiery.com owqieyuqowiery.com has address 67.215.77.132 Host owqieyuqowiery.com not found: 3(NXDOMAIN) 取决于你所说

如何测试给定的主机名是否真的存在于Java中

问题在于某些DNS服务,如Opendns,即使不存在DNS条目,也会返回IP地址,因此,
InetAddress.getByName(主机)
将始终返回某些内容

但是,
host
命令能够以某种方式检测到它:

~$ host owqieyuqowiery.com
owqieyuqowiery.com has address 67.215.77.132
Host owqieyuqowiery.com not found: 3(NXDOMAIN)

取决于你所说的“真实存在”是什么意思。你是说这是一个注册域名,背后有一个网站吗?与给定系统的IP地址相比,主机名只是一种更容易阅读/记忆的形式。换句话说,我可以注册一个域(这只是某个地方某个系统的一个可公开访问的短名称),而不是在该域指向的服务器上托管一个网站,这并不会降低该域的“真实性”

如果您只想查找
A
记录,这里有一个解决方案:

  • 博文:
  • 代码:
如果你想知道主机做什么,这可能会让你了解它为什么这么做,这里有一些信息:基本上,当这个失败时,这意味着DNS查找失败。也就是说,为了查找该域而连接到主机的DNS服务器返回的结果为零

而且,
host
返回的不仅仅是DNS
A
记录(这是网站使用的记录)。它还将为您提供MX(邮件服务器)记录等

例:


使用
InetAddress.getByName(地址).isRecable(超时)

如果您不能信任本地配置的冲突解决程序(可能是因为它涉及不存在的域),唯一的替代方法是直接向权威名称服务器查询相关域

对于Java,这应该可以通过使用库来实现


您需要从根名称服务器开始,沿着引用链向下(以与普通递归服务器相同的方式)查找适当的权威名称服务器。

我基本上需要知道它是否在DNS中有记录。啊,我更新了我的答案,以指向某人编写的一些示例代码。此项目有帮助吗?如果你不能信任OpenDNS的答案-**不要使用它们**@Alnitak这没有帮助,因为我不控制我的软件的托管位置。这是一种非常直接的方法,但只会告诉您是否可以通过ICMP请求或端口7上的TCP连接进行连接,而不是告诉您指定域的DNS记录是否存在。问题是isReachable对于任何主机名都将返回true,因为它将测试Opendns的服务器。这是一个很好的建议。您是否有使用
dnsjava
实现此功能的示例代码?
$ host google.com
google.com has address 74.125.225.48
google.com has address 74.125.225.49
google.com has address 74.125.225.50
google.com has address 74.125.225.51
google.com has address 74.125.225.52
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.