查看InetAddress.getAllByName()的源代码,您会发现,如果提供的String是IP地址的文本表示形式,则实际上并没有进行DNS查询.它仅返回一个包含单个包含IP的InetAdddress对象的数组.他们甚至在该方法中添加了一个方便的注释:
// if host is an IP address, we won't do further lookup
如果只有JavaDoc如此清晰.它指出:“如果提供文字IP地址,则仅检查地址格式的有效性.” …我认为这并不能告诉您它不会被查找.
但是,考虑一下……在InetAddress的上下文中是有道理的-该类封装了一个IP地址……您只有一个.它确实需要可以满足您要求的getHostNames()和getAllCanonicalNames()(请注意复数)方法.我正在考虑打开一个问题/提交补丁.
也就是说,目前似乎没有内置的方法可以执行支持多个PTR记录的RDNS查询.所有其他查找方法都简单地从返回的第一条记录中剔除,这就是您所得到的.
您将不得不研究Java的第三方DNS库(对不起,我没有使用它们的经验).
编辑添加:我喜欢弄清楚事情.我没有一个拥有多个PTR记录进行测试的IP手持设备,但是应该可以解决这个问题.
import java.io.IOException;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.InitialDirContext;
public class App
{
public static void main(String[] args) throws IOException, NamingException
{
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
InitialDirContext idc = new InitialDirContext(env);
String ipAddr = "74.125.225.196";
// Turn the IP into an in-addr.arpa name
// 196.225.125.74.in-addr.arpa.
String[] quads = ipAddr.split("\.");
StringBuilder sb = new StringBuilder();
for (int i = quads.length - 1; i >= 0; i--)
{
sb.append(quads[i]).append(".");
}
sb.append("in-addr.arpa.");
ipAddr = sb.toString();
Attributes attrs = idc.getAttributes(ipAddr, new String[] {"PTR"});
Attribute attr = attrs.get("PTR");
if (attr != null)
{
for (int i = 0; i < attr.size(); i++)
{
System.out.println((String)attr.get(i));
}
}
}
}