例如:java.net.InetAddress.getByName("72.14.235.104").getHostName()
正确返回"tw-in-f147.google.com"
但:java.net.InetAddress.getByName("211.155.224.227").getHostName()
错误返回"211.155.224.227",而无法得到正确结果"mx3.manufacturer.com"注:通过nslookup可以看到"211.155.224.227"的rdns结果应该是"mx3.manufacturer.com"
为什么有时候得不到正确的结果呢,有其他什么好的办法吗?(用InetAddress.getByAddress()的结果也是一样)

解决方案 »

  1.   

    答:
    getHostName()内部是调用getCanonicalHostName(),而它又是:
    获取此 IP 地址的完全限定域名。最大努力方法,意味着根据基础系统配置可能不能返回 FQDN。 
    因此参考代码如下:import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.*;public class TestHostName { /*返回ip对应的RDNS
     * @param  ip  字符串形式的ip
     * @return  返回ip对应的RDNS
    */
    public static String getRDNS(String ip) throws IOException
    {
    Process p=Runtime.getRuntime().exec("cmd /c nslookup  "+ip);
    BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line=null;
    while((line=br.readLine())!=null)
    {
    if(line.toLowerCase().startsWith("name:"))
    return line.substring(line.indexOf(":"));
    }
    return line;
    }

    public static void main(String[] args) throws Exception{
    // TODO Auto-generated method stub
          
          System.out.println("211.155.224.227的RDNS是: "+getRDNS("211.155.224.227"));
          System.out.println("72.14.235.104的RDNS是: "+getRDNS("72.14.235.104"));
    }}
    程序运行结果:
    211.155.224.227的RDNS是: :    mx3.manufacturer.com
    72.14.235.104的RDNS是: :    tw-in-f104.google.com
      

  2.   

    汗,多谢jiangnaisong了,
    不过,这个办法不是我希望的。我确实希望返回和nslookup一致的结果,但应该通过java的基本功能来实现,而不是cmd的方式。
    直观来说,我的系统运行在linux平台下,cmd肯定无效的。而且我应该希望得到一个通用(windows/linux都有效)的功能。不过你说的“基础系统配置”是指什么呢?既然nslookup能够得到正确结果,我就希望java本身有对应的实现。
    这个功能应该还是比较有用的,java不会没有对应的实现吧?
      

  3.   

    答:
    DNS域名解析是基于UDP的应用层的DNS协议,用JAVA当然能够实现.我一楼的帖子是想省事些做.JAVA的InetAddress类有时是不能完成这个任务的.自己用JAVA来基于UDP的应用层的DNS协议是太麻烦了.其实有许多现成的功能强大的纯JAVA的DNS与RDNS类库包.如:dnsjava.
    下面的JAVA是基于dnsjava2.0.6(最新版本)的RDNS解析程序:import org.xbill.DNS.*;
    import java.io.IOException;public class RDNS_Java {
     public static String reverseDns(String hostIp) throws IOException {
             Record opt = null;
             Resolver res = new ExtendedResolver();         Name name = ReverseMap.fromAddress(hostIp);
             int type = Type.PTR;
             int dclass = DClass.IN;
             Record rec = Record.newRecord(name, type, dclass);
             Message query = Message.newQuery(rec);
             Message response = res.send(query);         Record[] answers = response.getSectionArray(Section.ANSWER);
             if (answers.length == 0)
                return hostIp;
             else
                return answers[0].rdataToString();
       } public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

            System.out.println("211.155.224.227的RDNS是: "+reverseDns("211.155.224.227"));
            System.out.println("72.14.235.104的RDNS是: "+reverseDns("72.14.235.104"));
           
    }}程序运行结果:
    211.155.224.227的RDNS是: mx3.manufacturer.com.
    72.14.235.104的RDNS是: tw-in-f104.google.com.
      

  4.   

    呵呵,jiangnaisong 是哪儿去找来这些东西的?我总觉得java的类库包真是多,很难知道哪些该用哪些不该用。不过,听你说来,这个rdns似乎不算一个基础的功能,是一件比较麻烦的事情哈。多谢,我准备采用这个办法,
    不过,“JAVA的InetAddress类有时是不能完成这个任务的”,具体是什么时候呢?