Java DNS 解析問題 ... 請高手幫忙 !!

如何根據域名得到   DNS   解析結果的   MX   節點的完整機器名   ?  
  舉例來說   :    
      知道一個郵件     xxx@sohu.com   ,   得到域名     sohu.com  
      現在如何知道   sohu.com   域中   mailserver   的機器名     ?  
   
  问题点数:100、回复次数:7Top

1 楼colors(第厘十秒)回复于 2002-12-17 18:25:48 得分 0

gzTop

2 楼LiGun(^_^ 中国心_HSK ^_^)回复于 2002-12-18 15:54:15 得分 0

mail.域名Top

3 楼fastmask(我心烦)回复于 2002-12-19 08:23:17 得分 0

机器名?dns的结果是一个ip地址,机器名是可选的,所以不一定能够成功,况且机器名对于远程访问没有用处阿。Top

4 楼jekend(jekend)回复于 2002-12-19 13:01:29 得分 0

比如,   sohu.com   是一個域名,    
  但是     www.sohu.com   是   sohu.com   域下的   Web   服務器  
              sohumx.sohu.com   是   sohu.com   域下的   mail   服務器   .  
  那麼,   現在我知道一個郵件地址       xxx@sohu.com   .    
  我就需要知道   sohu.com   域下的   mail   服務器的名稱,   才能夠連接   .  
  這些   服務器名是需要在   dns   中設定的,    
  但是,   我不知道   java   中可否直接從   DNS   Server   獲得   sohu.com   的   mail   服務器的名稱   ?  
  Top

5 楼warmship(warmship)回复于 2002-12-19 18:27:03 得分 0

http://www.xbill.org/dnsjava  
   
  我用过。自己去查查吧。Top

6 楼warmship(warmship)回复于 2002-12-19 18:29:10 得分 50

/*  
    *   Copyright   (C)   The   Apache   Software   Foundation.   All   rights   reserved.  
    *  
    *   This   software   is   published   under   the   terms   of   the   Apache   Software   License  
    *   version   1.1,   a   copy   of   which   has   been   included   with   this   distribution   in  
    *   the   LICENSE   file.  
    */  
  package   org.apache.james.dnsserver;  
   
  import   org.apache.avalon.framework.activity.Initializable;  
  import   org.apache.avalon.framework.configuration.Configurable;  
  import   org.apache.avalon.framework.configuration.Configuration;  
  import   org.apache.avalon.framework.configuration.ConfigurationException;  
  import   org.apache.avalon.framework.logger.AbstractLogEnabled;  
  import   org.apache.avalon.phoenix.Block;  
  import   org.xbill.DNS.*;  
   
  import   java.net.InetAddress;  
  import   java.net.UnknownHostException;  
  import   java.util.*;  
   
  /**  
    *   @version   1.0.0,   18/06/2000  
    *   @author     Serge   Knystautas    
    */  
  public   class   DNSServer  
          extends   AbstractLogEnabled  
          implements   Block,   Configurable,   Initializable,    
          org.apache.james.services.DNSServer   {  
   
          private   Resolver   resolver;  
          private   Cache   cache;  
          private   byte   dnsCredibility;  
          private   Collection   servers   =   new   Vector();  
   
          public   void   configure(   final   Configuration   configuration   )  
                  throws   ConfigurationException   {  
   
                  //   Get   this   servers   that   this   block   will   use   for   lookups  
                  final   Configuration   serversConfiguration   =   configuration.getChild(   "servers"   );  
                  final   Configuration[]   serverConfigurations   =  
                          serversConfiguration.getChildren(   "server"   );  
   
                  for   (   int   i   =   0;   i   <   serverConfigurations.length;   i++   )  
                  {  
                          servers.add(   serverConfigurations[   i   ].getValue()   );  
                  }  
   
                  final   boolean   authoritative   =  
                          configuration.getChild(   "authoritative"   ).getValueAsBoolean(   false   );  
                  dnsCredibility   =   authoritative   ?   Credibility.AUTH_ANSWER   :   Credibility.NONAUTH_ANSWER;  
          }  
   
          public   void   initialize()  
                  throws   Exception   {  
   
                  getLogger().info("DNSServer   init...");  
   
                  if   (servers.isEmpty())   {  
                          try   {  
                                  servers.add(   InetAddress.getLocalHost().getHostName()   );  
                          }   catch   (   UnknownHostException   ue   )   {  
                                  servers.add(   "127.0.0.1"   );  
                          }  
                  }  
   
                  for   (Iterator   i   =   servers.iterator();   i.hasNext();   )   {  
                          getLogger().info("DNS   Servers   is:   "   +   i.next());  
                  }  
   
                  //Create   the   extended   resolver...  
                  final   String   serversArray[]   =   (String[])servers.toArray(new   String[0]);  
                  resolver   =   new   ExtendedResolver(   serversArray   );  
   
                  cache   =   new   Cache   (DClass.IN);  
   
                  getLogger().info("DNSServer   ...init   end");  
          }  
   
          public   Collection   findMXRecords(String   hostname)   {  
                  Record   answers[]   =   lookup(hostname,   Type.MX);  
   
                  Collection   servers   =   new   Vector   ();  
                  try   {  
                          if   (answers   ==   null)   {  
                                  return   servers;  
                          }  
   
                          MXRecord   mxAnswers[]   =   new   MXRecord[answers.length];  
                          for   (int   i   =   0;   i   <   answers.length;   i++)   {  
                                  mxAnswers[i]   =   (MXRecord)answers[i];  
                          }  
   
                          Comparator   prioritySort   =   new   Comparator   ()   {  
                                          public   int   compare   (Object   a,   Object   b)   {  
                                                  MXRecord   ma   =   (MXRecord)a;  
                                                  MXRecord   mb   =   (MXRecord)b;  
                                                  return   ma.getPriority   ()   -   mb.getPriority   ();  
                                          }  
                                  };  
   
                          Arrays.sort(mxAnswers,   prioritySort);  
   
                          for   (int   i   =   0;   i   <   mxAnswers.length;   i++)   {  
                                  servers.add(mxAnswers[i].getTarget   ().toString   ());  
                          }  
                          return   servers;  
                  }   finally   {  
                          //If   we   found   no   results,   we'll   add   the   original   domain   name   if  
                          //it's   a   valid   DNS   entry  
                          if   (servers.size   ()   ==   0)   {  
                                  try   {  
                                          InetAddress.getByName(hostname);  
                                          servers.add(hostname);  
                                  }   catch   (UnknownHostException   uhe)   {  
                                  }  
                          }  
                  }  
          }  
   
          public   Record[]   lookup(String   name,   short   type)   {  
                  return   rawDNSLookup(name,false,type);  
          }  
   
          private   Record[]   rawDNSLookup(String   namestr,   boolean   querysent,   short   type)   {  
                  Name   name   =   new   Name(namestr);  
                  short   dclass   =   DClass.IN;  
   
                  Record   []   answers;  
                  int   answerCount   =   0,   n   =   0;  
                  Enumeration   e;  
   
                  SetResponse   cached   =   cache.lookupRecords(name,   type,   dnsCredibility);  
                  if   (cached.isSuccessful())   {  
                          RRset   []   rrsets   =   cached.answers();  
                          answerCount   =   0;  
                          for   (int   i   =   0;   i   <   rrsets.length;   i++)   {  
                                  answerCount   +=   rrsets[i].size();  
                          }  
   
                          answers   =   new   Record[answerCount];  
   
                          for   (int   i   =   0;   i   <   rrsets.length;   i++)   {  
                                  e   =   rrsets[i].rrs();  
                                  while   (e.hasMoreElements())   {  
                                          Record   r   =   (Record)e.nextElement();  
                                          answers[n++]   =   r;  
                                  }  
                          }  
                  }  
                  else   if   (cached.isNXDOMAIN()   ||   cached.isNXRRSET())   {  
                          return   null;  
                  }  
                  else   if   (querysent)   {  
                          return   null;  
                  }  
                  else   {  
                          Record   question   =   Record.newRecord(name,   type,   dclass);  
                          org.xbill.DNS.Message   query   =   org.xbill.DNS.Message.newQuery(question);  
                          org.xbill.DNS.Message   response;  
   
                          try   {  
                                  response   =   resolver.send(query);  
                          }  
                          catch   (Exception   ex)   {  
                                  return   null;  
                          }  
   
                          short   rcode   =   response.getHeader().getRcode();  
                          if   (rcode   ==   Rcode.NOERROR   ||   rcode   ==   Rcode.NXDOMAIN)   {  
                                  cache.addMessage(response);  
                          }  
   
                          if   (rcode   !=   Rcode.NOERROR)   {  
                                  return   null;  
                          }  
   
                          return   rawDNSLookup(namestr,   true,   Type.MX);  
                  }  
   
                  return   answers;  
          }  
  }  
   
   
  上面是Jakarta/James的DNSServer的源码,仔细研究一下。Top

7 楼echou(岸边蚕豆)回复于 2002-12-23 13:03:38 得分 50

我用过dnsjava,和上面代码有些类似之处:  
   
  import   org.xbill.DNS.*;  
   
  public   class   MXLookup   {  
   
      public   static   String[]   lookup(String   domain)   {  
          Record[]   records   =   dns.getRecords(domain,   Type.MX);  
          if   (records   ==   null   ||   records.length   ==   0)   return   null;  
   
          //对records按照MX优先级进行排序,优先级高的在前面。  
          Arrays.sort(records,   new   Comparator()   {  
              public   int   compare(Object   o1,   Object   o2)   {  
                  MXRecord   r1   =   (MXRecord)o1;  
                  MXRecord   r2   =   (MXRecord)o2;  
                  return   r2.getPriority()   -   r1.getPropertiy();  
              }  
          }  
          String   []   hosts   =   new   String[records.length];  
          for   (int   i=0;   i              hosts[i]   =   ((MXRecord)records[i]).getTarget().toString();  
          return   hosts;  
      }    
  }  
   
  使用方法:  
      String[]   hosts   =   MXLookup.lookup("21cn.com");  
   
  返回的不是IP地址,而是MX主机名。返回的hosts可能是无效的,比如21cn.com返回两个MX记录:  
      mta.21cn.com和  
      mta2.21cn.com,其中mta.21cn.com连接不上。  
   

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12617475/viewspace-374267/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12617475/viewspace-374267/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值