`
cnhawkwing
  • 浏览: 65359 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java查询MX记录

阅读更多

package org.cnhawk;

import org.xbill.DNS.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;


public class LookDNSMX{ 

    private Resolver resolver;
    private Cache cache;
    private int DNSCredibility;
    private static LookDNSMX instance=null;
    private Collection DNSServers = new Vector();
   
   
    //构造函数
    public LookDNSMX() throws Exception{
     this.initialize();
    }
    
 public static LookDNSMX getInstance() throws Exception{
  if(instance==null)
   instance=new LookDNSMX();
  return instance; 
 }
   //初始化
    public void initialize() throws Exception {
        DNSServers.add("10.0.1.1");
        final String serversArray[] = (String[])DNSServers.toArray(new String[0]);
        System.out.println("Current DNS server is : "+serversArray[0].toString());
        try {
            resolver = new ExtendedResolver(serversArray );
        } catch (UnknownHostException uhe) {
            throw uhe;
        }

        cache = new Cache (DClass.IN);
       
    }

    //主方法
    public synchronized Collection findMXRecords(String hostname)throws Exception {
        Record DNSAnswers[] =null;
        Collection MXServers = new Vector();
        //调用查看DNS的记录的方法,返回一个Record记录数组
        DNSAnswers=this.rawDNSLookup(hostname,false,Type.MX);
       
        if (DNSAnswers == null) {
            MXServers.add(hostname);
            System.out.println(hostname+" MX result is "+hostname+"\r");
            return MXServers;
        }
        MXRecord MXAnswers[] = new MXRecord[DNSAnswers.length];
        for (int i = 0; i < DNSAnswers.length; i++) {
            MXAnswers[i] = (MXRecord)DNSAnswers[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);
        System.out.println("\n\n"+hostname+ "  MX result is:  ");
        String mxstr="";
        for (int i = 0; i < MXAnswers.length; i++) {
         mxstr=MXAnswers[i].getTarget ().toString ().trim();
            MXServers.add(mxstr.substring(0,mxstr.length()-1));
        }
        //System.out.println(hostname+ "  MX result is  \n"+mxstr);
        return MXServers;
    }
   
   
    /**
     * 根据给定的类型和主机名去查看DNS的记录
     * 返回一个Record记录数组
     *
     * @param hostname 被查看的主机名
     * @param querysent 这个查询是否已经被发送到DNS 服务器了
     * @param type 是要得到的记录类型
     */
   
    private Record[] rawDNSLookup(String hostname, boolean querysent, int type) {
      try{
        Name  name = Name.fromString(hostname, Name.root);
        short dclass = DClass.IN;
        Record [] DNSAnswers=null;
       
        SetResponse ResponseCached = cache.lookupRecords(name, type, DNSCredibility);
  if (ResponseCached.isSuccessful()) {
         
         return getDNSAnswers(ResponseCached);
        }
        else if (ResponseCached.isNXDOMAIN() || ResponseCached.isNXRRSET() || 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 DNSresponse;
           
            try {
                DNSresponse = resolver.send(query);
            }catch (Throwable e) {
             e.printStackTrace();
                return null;
            }
               
            int rcode = DNSresponse.getHeader().getRcode();
            if (rcode == Rcode.NOERROR || rcode == Rcode.NXDOMAIN) {
                ResponseCached = cache.addMessage(DNSresponse);
                return getDNSAnswers(ResponseCached);
            }
   
            if (rcode != Rcode.NOERROR) {
                return null;
            }
        }
        return DNSAnswers;
      }catch (Exception e){
         e.printStackTrace();
         return null;
      }
       
    }
   
    private Record[] getDNSAnswers(SetResponse responseCached)
    {
        Record [] DNSAnswers=null;
  try
  {
   int answerCount = 0;
   int n = 0;
      RRset [] rrsets = responseCached.answers();
      for (int i = 0; i < rrsets.length; i++) {
          answerCount += rrsets[i].size();
      }
     
      DNSAnswers = new Record[answerCount];
      Iterator itor = null;
      for (int i = 0; i < rrsets.length; i++) {
          itor = rrsets[i].rrs();
          while (itor.hasNext()) {
              DNSAnswers[n++]= (Record)itor.next();
          }
   }
      }catch (Exception e){
         e.printStackTrace();
         return null;
      }
      return DNSAnswers;
    }
   
    //测试方法
    public static void main(String args[]){
     try{
      LookDNSMX  client= new  LookDNSMX();
      Collection col=client.findMXRecords("sina.com");
      Iterator it=col.iterator();
      while(it.hasNext())
      {
       System.out.println(it.next());
      }
      
      col=client.findMXRecords("handuancn.com");
      it=col.iterator();
      while(it.hasNext())
      {
       System.out.println(it.next());
      }
     }catch(Exception e){
      e.printStackTrace();
     }
    }
   
}

 

分享到:
评论
1 楼 sanshizi 2013-01-19  

相关推荐

    Internet邮件MX记录介绍.pdf

    Internet邮件MX记录介绍Internet邮件MX记录介绍Internet邮件MX记录介绍

    javascript验证邮件地址和MX记录的方法

    本文实例讲述了javascript验证邮件地址和MX记录的方法。分享给大家供大家参考。具体如下: // Tests for a valid email address and optionally tests for valid MX records, too. function is_valid_email($email,...

    Java与模式

    实用的 java 设计原则 和 设计模式,阅读完本书,可以...第16章 专题:单例模式与MX记录 第17章 专题:多例\(Multiton\)模式与多语言支持 第18章 专题:序列键生成器与单例及多例模式 第19章 建造\(Builder\)模式

    Java与模式.清晰.rar

    第16章 专题:单例模式与MX记录 第17章 专题:多例(Multiton)模式与多语言支持 第18章 专题:序列键生成器与单例及多例模式 第19章 建造(Builder)模式 第20章 原始模型(Prototype)模式 第21章 专题:JavaBean...

    java企业人事管理系统

    实现对企业员工从招聘--&gt;试用-&gt;转正-&gt;离职或退休的全过程管理,能够记录员工的基本信息(支持相片)家庭信息、获奖信息、工作经历、培训信息和签约信息等。提供统计分析和生日提醒等扩展功能。 要求实现功能: 1、...

    基于JAVA jsp+sql智能道路交通信息管理系统的毕业设计,采用B/S模式进行,用DreamWeaver MX开发用户界面

    本系统可以帮助警察记录和管理车辆的违章信息,并且可以将违章信息进行公告、处罚,以便使道路交通更加畅通。本智能道路交通信息管理系统主要包括:违章信息录入,违章信息公告,违章出发,信息统计以及系统初始化和...

    学生信息管理系统java课程设计报告.doc

    整个个性化页面生成系统主要由使用Dreamweaver_MX开发的关联规则采掘系统和利用 JSP技术实现的个性化Web页面生成器两部分组成。关联规则采掘系统对数据库中的历史 记录进行分析,产生用户关联规则表;页面生成器则...

    java与模式

    16:单例模式与MX记录;17:多例模式;18:序列健生成器与单例及多例模式;19:建筑模式;20:原始模型模式;21:javabean冷藏和解冻;22:适配器模式;23:缺省适配器模式;24:合成模式;25:装饰模式;26:设计模式在JAVA I/O设计...

    一个Java小游戏抓不住的方块

     知识点:使用Graphics类制作方块,使用java.awt.Event类响应鼠标动作,使用Color类设置方块的颜色,使用int类记录光标的位置。  实现思路:首先要制作界面中的方块,通过Graphics类的对象函数g.setColor(Color....

    JAVA与模式

    com.javapatterns.singleton.mxrecord 专题:单例模式与MX记录 com.javapatterns.multilingual 专题:多例模式与多语言支持 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 ...

    Java与模式(含示例代码)

    16.2 目录服务与MX 记录................251 16.3 JNDI 架构介绍...........................252 16.4 如何使用JNDI 编程..................253 16.5 系统设计.....................................255 16.6 讨论.....

    班级网站管理系统java课程设计报告.doc

    它将帮助我们共享班级的一些信息,获取学校的相 关重要新闻动态,帮助我们记录班级的重大活动,为班级成员提供一个更为广阔的交流 平台,有助于同学间感情的培养,有利于班级的团结,班风的建设。 班级网站的研究...

    毕业设计:ASP.NET基于Web Mail收发系统设计与开发(源代码+论文)

    如果邮件的目的地址是另一个远程域的SMTP服务器,SMTP服务器就查询DNS Mail Exchange-MX记录,该记录为进入相应域的所有邮件提供SMTP服务器的IP地址,在找到该地址后,本地的SMTP服务器就会把邮件从本地邮件库发送到...

    TCP-IP详解卷1:协议

    14.3.2 DNS响应报文中的资源记录部分 147 14.4 一个简单的例子 147 14.5 指针查询 150 14.5.1 举例 151 14.5.2 主机名检查 151 14.6 资源记录 152 14.7 高速缓存 153 14.8 用UDP还是用TCP 156 14.9 另一个例子 156 ...

    源码:阎宏设计模式光盘

    com.javapatterns.singleton.mxrecord 专题:单例模式与MX记录 com.javapatterns.state 状态模式 com.javapatterns.strategy 策略模式 com.javapatterns.templatemethod 模板方法模式 com.javapatterns.uml 统一...

    基于JSP的智能道路交通信息管理系统设计与实现.zip

    本系统可以帮助警察记录和管理车辆的违章信息,并且可以将违章信息进行公告、处罚,以便使道路交通更加畅通。本智能道路交通信息管理系统主要包括:违章信息录入,违章信息公告,违章出发,信息统计以及系统初始化和...

    connect-dns-provider:Kafka Connect的DNS配置提供程序

    但是,还有更多类型的记录,例如MX用于管理电子邮件,而SRV用于服务解析。 SRV记录使您可以列出哪些主机名和端口正在提供某些服务。 查找群集的多个节点特别方便。 例如,Cassandra联系人,Kafka经纪人或Zookeeper...

    log-config-core:基于springMVC的动态等级

    日志配置核心 项目必须使用logback作为日志输出组件。 具体使用方法: //rainbowhorse.site/动态修改日志% ♡Maven坐标 &lt; groupId&gt;com.github.mx-go&lt;/ groupId&gt; &lt; artifactId&gt;log-config-core ...查询某日志文件最

    [计算机毕设]基于jsp+sql的智能道路交通信息管理系统设计与实现项目报告+源代码+开题报告+答辩PPT+外文翻译).zip

    本系统可以帮助警察记录和管理车辆的违章信息,并且可以将违章信息进行公告、处罚,以便使道路交通更加畅通。本智能道路交通信息管理系统主要包括:违章信息录入,违章信息公告,违章出发,信息统计以及系统初始化和...

    欧维涂鸦论坛美化版

    文本编写工具:Editplus2.11DWMX辅助 PaintBlueBBS简介 这是(PaintBlue.Net)开发的,以CG,手绘涂鸦,摄影为交流目的的综合Asp论坛平台 当前的发布V2.1AC(sp2)版本! 由于很多CGIPHP甚至ASP的涂鸦留言板都显得比较简陋~~...

Global site tag (gtag.js) - Google Analytics