Java:JAVA API域名解析说明

java常用的域名解析的方式是使用InetAddress中的如下2个方法:

InetAddress.getByName(String host);

InetAddress.getAllByName(String host);

以上方法的最大问题是不知道有几个域名服务器,以及IP是从哪个域名服务器解析出来的。

可以通过下面的代码先获取域名服务器的地址,然后从这些域名服务器分别获取解析出来的IP:

复制代码
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class DnsTester {

 // 获取默认的DNS服务器
 public static String[] getDnsNameServerUrlArray() {

  Hashtable<String, String> env = new Hashtable<String, String>();
  env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
  env.put(Context.PROVIDER_URL, "dns://");

  try {
   DirContext ctx = new InitialDirContext(env);
   String dndUrls = (String) ctx.getEnvironment().get(Context.PROVIDER_URL);

   System.out.println(dndUrls);

   return dndUrls.split(" ");
  } catch (NamingException e) {
   e.printStackTrace();
  }

  return new String[0];
 }

 // 使用DNS服务器解析域名
 public static Map<String, List<String>> getIpList(String domainName) {
  Map<String, List<String>> resultMap = new LinkedHashMap<>();

  for (String dnsUrl : getDnsNameServerUrlArray()) {
   List<String> results = new ArrayList<>();
   try {
    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
    env.put(Context.PROVIDER_URL, dnsUrl);

    DirContext ctx = new InitialDirContext(env);

    Attributes attrs = ctx.getAttributes(domainName, new String[] { "A" });

    for (NamingEnumeration<? extends Attribute> e = attrs.getAll(); e.hasMoreElements();) {
     Attribute a = e.nextElement();
     int size = a.size();
     for (int i = 0; i < size; i++) {
      results.add((String) a.get(i));
     }
    }

    resultMap.put(dnsUrl, results);

    System.out.println(dnsUrl + ": DNS resolve OK");
   } catch (NamingException e) {
    System.out.println(dnsUrl + ": " + e.getMessage());
   }
  }

  return resultMap;
 }

 public static void main(String[] args) throws NamingException {
  String domainName = "baidu.com";

  if (args.length > 0) {
   domainName = args[0];
  }
  Map<String, List<String>> ipList = getIpList(domainName);

  System.out.println(domainName + ": " + ipList);
 }

}

执行命令

java DnsTester 163.com

运行的结果如下:

dns://25.11.1.3 dns://25.11.1.4 dns://221.179.155.161 dns://221.179.155.177

dns://25.11.1.3: DNS name not found response code 3

dns://25.11.1.4: DNS name not found response code 3

dns://221.179.155.161: DNS resolve OK

dns://221.179.155.177: DNS resolve OK

163.com: {dns://221.179.155.161=123.58.180.8, 123.58.180.7, dns://221.179.155.177=123.58.180.7, 123.58.180.8}

参考文档

DNS Service Provider for the Java Naming Directory Interface (JNDI)

相关推荐
写代码写到手抽筋5 小时前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.5 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
jeffer_liu6 小时前
Spring AI 生产级实战:裁判员
java·人工智能·后端·spring·大模型
何以解忧,唯有..6 小时前
Python包管理工具pip:从入门到精通
开发语言·python·pip
雪的季节6 小时前
RabbitMQ详解
开发语言
小bo波7 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
ice8130331817 小时前
【Python】Matplotlib折线图绘制
开发语言·python·matplotlib
夜微凉47 小时前
三、Spring
java·后端·spring
三品吉他手会点灯7 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法