需求: 给定一个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 类, 获取端口号的代码如下:

1/*** 获取端口号

*

* @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;

}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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;

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

本质上, 也可以通过正则表达式或者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;

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

可以看到,我们使用了 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);

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

执行结果为:

host=www.cncounter.com

port=80

address=198.11.179.831

2

3

知道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;

}

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

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

日期: 2017年12月05日

java域名查询_Java技巧: 根据网址/域名查询DNS/IP地址相关推荐

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

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

  2. 如何获取域名(网址)对应的IP地址

    域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位.通俗点讲,域名就是我们平时进行网络浏览时所用到的网址( ...

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

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

  4. java 根据ip获取dns_Java技巧: 根据网址查询DNS/IP地址

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

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

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

  6. java web数据库查询_Java Web开发之信息查询方式总结

    本文实例讲述了Java Web开发之信息查询方式总结.分享给大家供大家参考.具体如下: 这里介绍的查询方式有: ① 根据某个特定的字段查询: ② 在多个字段中查询: ③ 根据任意字段查询: ④ 任意字 ...

  7. es java 模糊查询_java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  8. mysql查询显示技巧_MYSQL SQL高级查询技巧

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

  9. linux系统路由器地址查询,如何在任何平台上查找路由器的IP地址

    您是否需要对路由器的设置进行一些更改,例如选择新密码或调整家长控制?也许您遇到了一些连接问题,并想对网络连接进行故障排除. 如果您需要对网络进行任何更改,则通常将登录路由器的配置页面,方法是在网络浏览 ...

最新文章

  1. java如何实现成绩排序,小实例-实现对成绩总分由高到低的排序-Java中数组对象的排序...
  2. 【聊透SpringMVC】java找不到指定文件
  3. python中的函数及作用域的理解
  4. 前端(二)之 CSS
  5. Java关键字(二)——native
  6. Yahoo 其实比你想的更糟糕!
  7. Angular单元测试里pipe的mock设计
  8. 家里wifi网速越来越慢_家里的wifi信号不好?有了它再也不怕网速慢啦
  9. java通过jdbc访问mysql,update数据返回值的思考
  10. C#一次性删除委托中的所有方法
  11. JavaWeb02-HTML篇笔记(一)
  12. ACM之java速成
  13. 小米9pro MIUI11.12.19 简化代码 布局随切 核心CPU 黑域
  14. 软硬件交互 - 扫码枪
  15. 西门子数控系统变量刀补输入——使用$TC_DP函数
  16. 2017-4-18 CCCC决赛总结
  17. PJSIP 下载和编译
  18. 自研芯片,快手打响 ToB 第一战!
  19. Video IP:Video_In_to_AXI4-stream
  20. 关于Google Pay JAVA后端处理

热门文章

  1. vue页面和html混合,html和vue混合开发
  2. 服务器安全防护的办法
  3. 2017年考研英语二真题中文章来源及规律分析
  4. Numpy精炼操作大全
  5. linux 的memset函数是什么,memset函数详细说明
  6. Vue动态控制disabled属性
  7. android的liveview装载数据
  8. 使用RTSP协议读海康设备的视频记录
  9. 什么是回流焊?回流焊原理及工艺介绍
  10. SpringCloud Feign 传参问题及传输Date类型参数的时差