Java DNSLookup 获取 DNS 属性

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15239220/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 18:57:11  来源:igfitidea点击:

Java DNSLookup get DNS attributes

javadnsjndi

提问by MikeNQ

I'm quite new to the network DNS records and need a program that can run lookup to get 3 main DNS records of a domain (A,MX,NS).

我对网络 DNS 记录很陌生,需要一个可以运行查找的程序来获取域(A、MX、NS)的 3 个主要 DNS 记录。

I have been looking for a java solution here an there and my final class is as below: However, I will always get a NameExceptionand can't find the reason for it.

我一直在这里和那里寻找一个 java 解决方案,我的最后一课如下: 但是,我总是会得到一个NameException并且找不到它的原因。

[EDIT]: The problem seem to be with our internet, because using other wifi, the program run just fine.

[编辑]:问题似乎出在我们的互联网上,因为使用其他 wifi,程序运行得很好。

Many thanks,

非常感谢,

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();
        }
    }
}

Output:

输出:

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

回答by NPKR

I have tried with provided class (DNSLookup.java), it's working for me.

我试过提供的类 ( DNSLookup.java),它对我有用。

My underestanding is it's giving timeOut exception, means its not able to connect to server.

我的理解是它给出了超时异常,这意味着它无法连接到服务器。

Check your internet connection ?