我在堆栈溢出中寻找了如何在Java中进行IP查找,但答案与我已经在做的事情相匹配,并没有解决我的问题.
这是我的代码:
public void printHostname( String ip ) {
System.out.println( InetAddresses.forString( ip ).getCanonicalHostName( ) );
}
Run Code Online (Sandbox Code Playgroud)
InetAddresses只是一个来自番石榴库的实用程序类来获取InetAdress.
问题:此代码与某些IP地址一样正常工作,而不是与其他IP地址一起工作.
例如,对于IP 157.55.39.29,输出为:
msnbot-157-55-39-29.search.msn.com
Run Code Online (Sandbox Code Playgroud)
根据Linux host命令,这个结果似乎是正确的:
> host 157.55.39.29
29.39.55.157.in-addr.arpa domain name pointer msnbot-157-55-39-29.search.msn.com.
Run Code Online (Sandbox Code Playgroud)
对于IP 123.125.71.75,该host命令返回:
> host 123.125.71.75
75.71.125.123.in-addr.arpa domain name pointer baiduspider-123-125-71-75.crawl.baidu.com.
Run Code Online (Sandbox Code Playgroud)
但是我的Java代码的输出是:
123.125.71.75
Run Code Online (Sandbox Code Playgroud)
而预期的产出应该是
baiduspider-123-125-71-75.crawl.baidu.com
Run Code Online (Sandbox Code Playgroud)
getCanonicalHostName方法的javadoc 说:
返回:
此IP地址的完全限定域名,或者如果安全检查不允许操作,则返回 IP地址的文本表示形式.
但我很确定这不是一个安全检查的问题......或者我不明白什么是错的.
你有什么建议来解释这种行为吗?你有解决方法吗?
在寻找解决方案时,我尝试在JDK中调试实现:
// first lookup the hostname
host = nameService.getHostByAddr(addr.getAddress());
/* check to see if calling code is …Run Code Online (Sandbox Code Playgroud)