需求: 给定一个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, 请根据具体情况进行适当的封装和处理。

日期: 2017年12月05日

java 根据ip获取dns_Java技巧: 根据网址查询DNS/IP地址相关推荐

  1. Java技巧: 根据网址查询DNS/IP地址

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...

  2. java获取dns_Java 根据网址查询DNS/IP地址的方法

    说明: 本文不涉及底层的 DNS 协议, 直接使用Java平台提供的API进行操作. DNS也就是 Domain Name Service,即 域名服务. 我们知道, Java中与网址有关的类包括 j ...

  3. java域名查询_Java技巧: 根据网址/域名查询DNS/IP地址

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...

  4. Java技巧: 根据网址/域名查询DNS/IP地址

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...

  5. 根据ip获取所在城市 php,PHP:根据IP地址获取所在城市

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 if ( $useripFlag == chr( 2 ) ) { $AddrSeek = fread( $fd, 3 ): ...

  6. java 根据ip获取mac地址_利用java如何根据IP获取mac地址

    利用java如何根据IP获取mac地址 发布时间:2020-11-25 15:49:42 来源:亿速云 阅读:74 作者:Leah 利用java如何根据IP获取mac地址?针对这个问题,这篇文章详细介 ...

  7. java通过ip获取网卡MAC地址

    参考:http://www.jb51.net/article/73882.htm /** * 获取MAC地址 * @author * 2011-12 */ public static class Ge ...

  8. java 根据ip获取mac地址,java服务器端根据ip获取客户端mac地址

    java服务器端根据ip获取客户端mac地址 2014/8/20 22:01:29  475900947  程序员俱乐部  我要评论(1) 摘要://判断系统publicStringcheckSys( ...

  9. geoip java api zh cn_通过GeoIP2分析访问者IP获取地理位置信息

    MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容.诈欺检测.广告定向.网站流量分析.执行规定.地理目标定位.地理围栏定位 (geo-fencing) ...

最新文章

  1. android矢量动画 充电,android矢量动画
  2. 数据结构笔记 递推与迭代
  3. Linux上新建用户及赋权操作
  4. Python从菜鸟到高手(5):数字
  5. 关于程序员就业岗位及岗位市场的思考
  6. codeforces 133A-C语言解题报告
  7. mysql数据表的创建-数据类型
  8. perf script 执行时间_在Python中准确地测量代码执行时间
  9. 聊天机器人不仅能省下客服成本 体验可能会更好
  10. 对比python的进程和线程:多线程是假的
  11. css中的容器坍塌问题
  12. 周末分享 | 2019年最好的演讲:别让任何人打乱你的人生节奏
  13. 给我一篇假论文,我能骗倒半个地球
  14. mariadb登陆报错: 1698 - Access denied for user
  15. vue开发银行流水查询系统--基于巨杉数据库
  16. 从零开始学USB(一、基础知识1)
  17. 有趣的动态壁纸如何制作
  18. 新能源电动车充电隐患不得不防,这些常识要知道
  19. java的HMACSHA1加密算法
  20. oracle如何设置连接数,关于Oracle连接数设置

热门文章

  1. C语言按要求打印数组
  2. HDU 3336 Count the string KMP
  3. 魅族建立基于M8的Android开源项目
  4. asp.net基础复习(二)——母版页
  5. django 模板里面for循环常用的方法
  6. Xmodem恢复交换机IOS
  7. 一个严重损坏Excel深度修复案例
  8. Javascript 页面模板化 ——大部分人没有使用过的方法
  9. struts2 中文乱码问题
  10. iframe高度动态自适应