2013-03-06 35 views
2

我对网络DNS记录相当陌生,需要一个可以运行查找以获取域(A,MX,NS)的3个主DNS记录的程序。Java DNSLookup获取DNS属性

我一直在寻找一个Java解决方案在这里的存在,我的最后一类是如下: 不过,我总是会得到NameException并不能找到它的原因。

[编辑]:这个问题似乎与我们的互联网,因为使用其他无线网络,程序运行得很好。

非常感谢,

import javax.naming.directory.Attributes; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.util.Hashtable; 

public class DNSLookup 
{ 
    public static void main(String args[]) 
    { 
     String host = "google.com"; 
     try 
     { 
      InetAddress inetAddress = InetAddress.getByName(host); 
      // show the Internet Address as name/address 
      System.out.println(inetAddress.getHostName() + " " + inetAddress.getHostAddress()); 

      Hashtable<String, String> env = new Hashtable<String, String>(); 
      //env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
      //env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial"); 

      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.dns.DnsContextFactory"); 
      //env.put(Context.PROVIDER_URL, "dns://google.com"); 

      // get the default initial Directory Context 
      InitialDirContext iDirC = new InitialDirContext(env); 
      // get the DNS records for inetAddress 
      Attributes attributes = iDirC.getAttributes("dns:/"+inetAddress.getHostName()); 
      // get an enumeration of the attributes and print them out 
      NamingEnumeration<?> attributeEnumeration = attributes.getAll(); 
      System.out.println(""); 
      while (attributeEnumeration.hasMore()) 
      { 
       System.out.println("" + attributeEnumeration.next()); 
      } 
      attributeEnumeration.close(); 
     } 
     catch (UnknownHostException exception) 
     { 
      System.err.println("ERROR: Cannot access '" + host + "'"); 
     } 
     catch (NamingException exception) 
     { 
      System.err.println("ERROR: No DNS record for '" + host + "'"); 
      exception.printStackTrace(); 
     } 
    } 
} 

输出:

google.com 74.125.128.113 
ERROR: No DNS record for 'google.com' 
javax.naming.CommunicationException: DNS error [Root exception is java.net.SocketTimeoutException: Receive timed out]; remaining name 'google.com' 
    at com.sun.jndi.dns.DnsClient.query(Unknown Source) 
    at com.sun.jndi.dns.Resolver.query(Unknown Source) 
    at com.sun.jndi.dns.DnsContext.c_getAttributes(Unknown Source) 
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(Unknown Source) 
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(Unknown Source) 
    at com.sun.jndi.toolkit.url.GenericURLDirContext.getAttributes(Unknown Source) 
    at javax.naming.directory.InitialDirContext.getAttributes(Unknown Source) 
    at javax.naming.directory.InitialDirContext.getAttributes(Unknown Source) 
    at gimasys.dnsCrawler.DNSLookup.main(DNSLookup.java:35) 
Caused by: java.net.SocketTimeoutException: Receive timed out 
    at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method) 
    at java.net.DualStackPlainDatagramSocketImpl.receive0(Unknown Source) 
    at java.net.AbstractPlainDatagramSocketImpl.receive(Unknown Source) 
    at java.net.DatagramSocket.receive(Unknown Source) 
    at com.sun.jndi.dns.DnsClient.doUdpQuery(Unknown Source) 
    ... 9 more 

回答

2

我与提供的类(DNSLookup.java)尝试,它为我工作。

我的underestanding是它给了timeOut异常,意味着它无法连接到服务器。

Check your internet connection ? 
+0

互联网工作正常,否则它甚至无法将主机名解析为IP地址。 – MikeNQ 2013-03-06 05:01:38