Java如何根据网址查询DNS/IP地址

需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号。

说明: 本文不涉及底层的 DNS 协议, 直接使用Java平台提供的API进行操作。

DNS也就是 Domain Name Service,即 域名服务。

我们知道, Java中与网址有关的类包括 java.net.URL 和 java.net.URI 等, 其中 URI 是资源定位符, 可能包括 file: 之类的协议。

所以此处我们使用 URL 类, 获取端口号的代码如下:

 /**
   * 获取端口号
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static int parsePort(String href) throws IOException {
    //
    URL url = new URL(href);
    // 端口号; 如果 href 中没有明确指定则为 -1
    int port = url.getPort();
    if (port < 0) {
      // 获取对应协议的默认端口号
      port = url.getDefaultPort();
    }
    return port;
  }

URL 类是Java早期就存在的一个类。 内部逻辑比较复杂, 有兴趣可以自己查看相关的JDK实现代码。

其中获取端口号的2个方法:

getPort() 就是获取网址里面指明的端口号, 如果没有指定, 则返回 -1。

getDefaultPort() 是获取协议对应的默认端口号, 如 http 协议默认端口号为 80, https 协议默认端口号是 443 等。

然后我们看提取 Host 部分的代码:

 /**
   * 获取Host部分
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static String parseHost(String href) throws IOException {
    //
    URL url = new URL(href);
    // 获取 host 部分
    String host = url.getHost();
    return host;
  }

本质上, 也可以通过正则表达式或者String直接截取 Host, 但如果碰上复杂情况, 也不好处理, 例如: https://yourname:passwd@gitee.com/mumu-osc/NiceFish.git 这样的复杂网址。

提取出域名之后, 可以通过 java.net.InetAddress 类来查找IP地址。

代码如下所示:

 /**
   * 根据域名(host)解析IP地址
   *
   * @param host 域名
   * @return
   * @throws IOException
   */
  public static String parseIp(String host) throws IOException {
    // 根据域名查找IP地址
    InetAddress inetAddress = InetAddress.getByName(host);
    // IP 地址
    String address = inetAddress.getHostAddress();
    return address;
  }

可以看到,我们使用了 InetAddress.getByName() 静态方法来查找IP。

该类也提供了其他静态方法, 但一般不怎么使用, 有兴趣可以点开源码看看。

然后, 我们通过 main() 方法进行简单的测试:

 public static void main(String[] args) throws IOException {
    //
    String href = "http://www.cncounter.com/tools/shorturl.php";
    // 端口号
    int port = parsePort(href);
    // 域名
    String host = parseHost(href);
    // IP 地址
    String address = parseIp(host);
  //
    System.out.println("host=" + host); 
    System.out.println("port=" + port); 
    System.out.println("address=" + address); 
  }

执行结果为:

host=www.cncounter.com
port=80
address=198.11.179.83

知道IP和端口号, 我们就可以直接通过 Socket 来进行连接了。

当然, 如果是 http 协议, 可以使用 Apache 的 HttpClient 工具, 功能强大而且使用方便。 但这个库有个不好的地方在于,各个版本之间并不兼容, API 也经常换, 编程时需要根据特定版本号来进行处理。

完整的代码如下所示:

import java.io.IOException;
import java.net.*;
/**
 * 查找IP地址
 */
public class TestFindDNS {
  public static void main(String[] args) throws IOException {
    //
    String href = "http://www.cncounter.com/tools/shorturl.php";
    // 端口号
    int port = parsePort(href);
    // 域名
    String host = parseHost(href);
    // IP 地址
    String address = parseIp(host);
    //
    System.out.println("host=" + host);
    System.out.println("port=" + port);
    System.out.println("address=" + address);
  }
  /**
   * 获取端口号
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static int parsePort(String href) throws IOException {
    //
    URL url = new URL(href);
    // 端口号; 如果 href 中没有明确指定则为 -1
    int port = url.getPort();
    if (port < 0) {
      // 获取对应协议的默认端口号
      port = url.getDefaultPort();
    }
    return port;
  }
  /**
   * 获取Host部分
   *
   * @param href 网址, ftp, http, nntp, ... 等等
   * @return
   * @throws IOException
   */
  public static String parseHost(String href) throws IOException {
    //
    URL url = new URL(href);
    // 获取 host 部分
    String host = url.getHost();
    return host;
  }
  /**
   * 根据域名(host)解析IP地址
   *
   * @param host 域名
   * @return
   * @throws IOException
   */
  public static String parseIp(String host) throws IOException {
    // 根据域名查找IP地址
    InetAddress.getAllByName(host);
    InetAddress inetAddress = InetAddress.getByName(host);
    // IP 地址
    String address = inetAddress.getHostAddress();
    return address;
  }
}

OK, 请根据具体情况进行适当的封装和处理。

原创文章,作者:VDHCO,如若转载,请注明出处:http://www.wangzhanshi.com/n/13803.html

(0)
VDHCO的头像VDHCO
上一篇 2025年1月1日 17:04:44
下一篇 2025年1月1日 17:04:46

相关推荐

  • 虚拟机:三台虚拟机互通且连网

    虚拟机:三台虚拟机互通且连网 目录:一、虚拟机1.相关软件2.虚拟机安装3.多台虚拟机互通且上网  二、多台虚拟机互通且连网前提环境:三台虚拟机处于“仅主机模式”三台虚拟机:Ser…

    2025年1月1日
  • Linux下如何清除DNS缓存

    有时候电脑突然上不了网,或者存在某些网站打不开的情况,但别的网站又可以打开,解决办法需要清除DNS缓存. Linux下DNS缓存实现通常有两种方式:一种是用DNS缓存程序NSCD(…

    2025年1月1日
  • PowerShell 给现有DNS记录创建PTR反向查询

    今天早上豆子无意中发现公司的DNS服务器上面只有正向的解析,而没有对应的PTR记录。换句话说,可以通过域名来解析IP地址,但是倒过来IP地址是找不着域名的。 1个小时写了个很简单的…

    2025年1月1日
  • 浅谈Windows DNS服务器"蠕虫级"漏洞

    漏洞介绍 SigRed漏洞的高危害性在于其是可蠕虫的,也就是可以自传播的,无需用户交互就能传播到易受攻击的设备上,允许未经身份验证的远程攻击者获得针对目标服务器的域管理员特权,并完…

    2025年1月1日
  • Ubuntu系统怎么配置DNS

    经过长时间学习Ubuntu DNS,你可能会遇到Ubuntu DNS中网络问题,这里将介绍Ubuntu DNS解决网络问题的方法,新装了Ubuntu,虽然使用图形界面明明已经设置好…

    DNS解析 2025年1月1日
  • Windows server 2008安装dns

    Windows server 2008安装dns打开服务器管理器选择角色,添加角色点击下一步勾选DNS服务器,下一步点击下一步点击安装安装成功管理工具,打开DNS,开始配置DNS配…

    2025年1月1日
  • dns netstat route arp tcpdump

    cat /etc/resolv.conf   #dns信息 nameserver 192.168.100.2 netstat -r -n  …

    DNS解析 2025年1月1日
  • DNS解析失败了怎么办

    一、用nslookup来判断是否真的是DNS解析故障 1、确认系统是windows 2000和windows xp以上操作系统,然后通过“开始-》运行-》输入CMD”后回车进入命令…

    DNS解析 2025年1月1日
  • DNS的原理和作用是什么呢

    Azure 的这次故障,国内很安静,国外很热闹,说明国内使用 Azure 的还是少。  微软云的这次故障,大概持续了 3 个小时。官方解释说是因为人为因素,把 DNS 配…

    2025年1月1日
  • Linux下如何配置DNS服务

    一、DNS服务简介 DNS:域名系统。主要用来记录(登记)域名和IP地址的映射关系(对应关系)。DNS功能:域名解析。 正向解析:根据域名来解析出IP地址。域名&mdash…

    2025年1月1日

发表回复

登录后才能评论