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)

相关推荐
weixin_440784116 小时前
【HandlerThread实现原理】
android·java·开发语言
天空'之城6 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
leoZ2316 小时前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
XR1234567886 小时前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟7 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君8 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1238 小时前
SpringDAO的用法
java·开发语言·数据库
happymagic8 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
格林威10 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
都叫我大帅哥11 小时前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java