文档章节

Java使用InetAddress类获取主机名和IP地址(学习笔记)

ND小龙
 ND小龙
发布于 2017/08/14 00:28
字数 870
阅读 6
收藏 0

Java提供一系列的类支持Java程序访问网络资源。Java.net包中有InetAddress类的定义,InetAddress类的对象用于IP地址和域名。它代表了一个网络目标地址,包括主机名和数字类型的地址信息。该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。

 

实例化一个InetAddress类,因为此类无构造方法,所以实例化此类只需要使用静态方法。

开发者门户中使用 InetAddress.getByName(hostName); 方法来判断域名DNS解析是否正确:

	@RequestMapping(value = "/getStatus", method = RequestMethod.GET)
	@ResponseBody
	public boolean getStatus(String hostName){
		try {
		      InetAddress.getByName(hostName);
		      return true;
		     
		 }catch (Exception e) {
		       return false;
		 }
	}

 

一般来说,此方法若传入的hostName域名DNS解析有效,则能返回一个InetAddress对象。

通过该对象获取该域名主机IP地址。

 

同样可通过给定的原始IP地址,返回一个InetAddress对象:

InetAddress inetAddress=InetAddress.getByAddress(b); 

String domainName = inetAddress.getHostName();//获得主机名
String IPName = inetAddress.getHostAddress();//获得IP地址

System.out.println(domainName);
System.out.println(IPName);

其中的b为一个字节数组 ,参数按网络字节顺序:地址的高位字节位于 getAddress()[0] 中,IPv4 地址 byte 数组的长度必须为 4 个字节,IPv6 byte 数组的长度必须为 16 个字节。

 

获取原始IP地址时,返回的是一个字节数组,如果把这个字节输出到控制台下的话,会显示此字节数组在内存中的存放地址。输出时用了address[0]等数组的形式输出字节,其中如果字节数组中的某个字节大于128的话,将会导致输出来的数字是负数,应此我把我的IP地址中超过128的加上256,便没问题。

 

注:32位二进制网络地址

A(1.0.0.0-126.255.255.255):0,7位网络号,后24位为主机号;
B(128.0.0.0-191.255.255.255):10,14位网络号,后16位为主机号;
C(192.0.0.0-223.255.255.255):110,21位网络号,后8位为主机号;
D(224.0.0.0-239.255.255.255):1110,28位多点广播组标号;
E(240.0.0.0-254.255.255.255):1111,保留试验使用。

 

InetAddress的主要方法

— toString() 方法,将此 IP 地址转换为 String。
— byte[ ] getAddress() 方法,返回此 InetAddress 对象的原始 IP 地址。如果将此字节数组输出在控制台下,会出现一个存放此字节数组的内存地址。
— String getCanonicalName() 方法, 获取此 IP 地址的完全限定域名。
— String getHostAddress() 方法,返回 IP 地址字符串(以文本表现形式)。
— String getHostName() 方法,获取此 IP 地址的主机名。
— boolean isReachable(int timeout) 方法,测试是否可以达到该地址。

 

 

有时主机名可能比较复杂,会使用主机别名。因此获取主机名需要特定的方法:

public String getCanonicalHostName()

该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。

1. 使用 getLocalHost() 创建InetAddress对象

    此时getCanonicalHostName方法和getHostName方法得到的都是本机名

2. 使用域名 创建InetAddress对象

    使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器

    但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名

3. 使用IP地址 创建InetAddress对象

    此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。

本文转载自:http://zzqrj.iteye.com/blog/544784

共有 人打赏支持
ND小龙
粉丝 10
博文 45
码字总数 2295
作品 0
福州
面向基础系列之---Java网络编程---网络连接组件的使用(InetAddress)

这个系列是我一直想写的,因为从入职第一年的第一个月开始(那时还在zte),我就买了网络上唯一的一本,写Java网络的书籍:《Java网络编程》。当时功底一般,感觉看起来,还是很多云里雾里,...

心中的理想乡
09/10
0
0
JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52723439 JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议...

Aduroidpc
2016/10/02
0
0
InetAddress类之创建新的InetAddress对象

java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示。大多数其他网络类都要用到这个类,包括Socket,ServerSocket,URL,DatagramSocket,DatagramPacket等。一般地讲,它包...

柳哥
2015/01/26
0
3
java基础专栏—java网络编程

java网络编程 在网络成层中TCP对应于四层 通常是对网络连接设备的驱动协议,例如对光纤和都对网线的驱动不一样 TCP/IP协议的核心,他用于将数据分组 包括TCP,UDP 主要是负责应用程序的协议。...

T-newcomer
2017/10/25
0
0
使用Java的request获取IP地址实例

本文向您介绍使用Java获取IP地址的方法,在request.getRemoteAddr()方法在使用方向代理失效的情况下,本文的方法依然可以获取真是地址。 在JSP里,获取客户端的IP地址的方法是:request.get...

功夫panda
2012/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux运维人员必会运维工具

linux运维人员必会开源运维工具体系 说明:不同的技术人员,不同的阶段确定知识边界非常重要,否则,就像马拉车,不知道终点在哪,累死也达不到目标。例如拿8K要学多少,拿15K要学多少。一个...

寰宇01
22分钟前
2
0
10大PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的 10个开源的Php比特币项目,将有助于你了解在自己的应用中 如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方...

汇智网教程
43分钟前
1
0
springclould feign客户端添加全局参数

用springclould feign作为调用服务的客户端,一般来说参数可以写在feignclient的方法参数里 有时需要所有feign请求都统一添加一些参数,例如token用于鉴权等,可以这样做: 添加一个配置类,...

canneljls
44分钟前
1
0
win32截屏并rgb24转yuv420

//最终f的内存布局为BGRA格式,需要保证buf长度足够(>w*h*4)void ScreenCap(void* buf, int w, int h){ HWND hDesk = GetDesktopWindow(); HDC hScreen = GetDC(hDesk); ......

styleman
今天
1
0
php输出mysql取出的中文为??的问题

解决方法: @ $db=new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DB); $db->query("set names utf8");//添加此语句,可以解决问题...

Aomo
今天
1
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部