InetAddress类的常用方法介绍
2015-10-17 18:21
441 查看
IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础。InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。
InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。
InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。
InetAddress类
该类代表ip地址,下面还有两个子类,分别是Inet4Address和Inet6Address他们分别代表IPV4地址和IPV6地址
该类没有构造器,可以通过它的两个静态方法来获取InetAddress的实例
>getByName(String host) 根据主机名获取对应的InetAddress对象
使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。
如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。
InetAddress address=InetAddress.getByName("141.146.8.66");
System.out.println(address.getHostName());//需要访问DNS服务器才能得到域名
InetAddress address=InetAddress.getByName("1.2.3.4");//IP地址不存在
System.out.println(address.getHostName());//直接返回IP地址
用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用 getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回。
>getByAddress(byte[] addr)根据源ip地址来获取InetAddress对象
> InetAddress.getLocalHost()获取本机的ip地址的主机名
该类常用的其他几个方法:
try {
InetAddress address=InetAddress.getLocalHost();
System.out.println(address.getHostAddress());//输出ip字符串
System.out.println(address.getHostName());//输出用户名
System.out.println(address.getCanonicalHostName());//输出本机的主机名.权限定域名(lan)
} catch (UnknownHostException e) {
e.printStackTrace();
}
getCanonicalHostName()方法
定义:public String getCanonicalHostName()
该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。
1. 使用 getLocalHost() 创建InetAddress对象
此时getCanonicalHostName方法和getHostName方法得到的都是本机名
2. 使用域名 创建InetAddress对象
使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器
但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名
3. 使用IP地址 创建InetAddress对象
此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。
之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-
portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如 www.oracle.com
InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。
InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。
InetAddress类
该类代表ip地址,下面还有两个子类,分别是Inet4Address和Inet6Address他们分别代表IPV4地址和IPV6地址
该类没有构造器,可以通过它的两个静态方法来获取InetAddress的实例
>getByName(String host) 根据主机名获取对应的InetAddress对象
使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。
如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。
InetAddress address=InetAddress.getByName("141.146.8.66");
System.out.println(address.getHostName());//需要访问DNS服务器才能得到域名
InetAddress address=InetAddress.getByName("1.2.3.4");//IP地址不存在
System.out.println(address.getHostName());//直接返回IP地址
用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用 getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回。
<span style="white-space:pre"> </span>InetAddress address=InetAddress.getByName("www.baidu.com"); System.out.println(address.getHostName());//不需要访问DNS服务器就能得到域名
<span style="white-space:pre"> </span>try { InetAddress address = InetAddress.getByName("www.baidu.com"); System.out.println(address);//www.baidu.com/119.75.218.70 } catch (UnknownHostException e) { e.printStackTrace(); }
>getByAddress(byte[] addr)根据源ip地址来获取InetAddress对象
InetAddress address; try { <span style="white-space:pre"> </span>address= InetAddress.getByAddress(new byte[]{119,75,218,70}); System.out.println(address);//输出结果为:/119.75.218.70和字符串str相一致 address = InetAddress.getByAddress("www.baidu.com", ipBuf); System.out.println(address);//输出结果为www.baidu.com/119.75.218.70 } catch (UnknownHostException e) { e.printStackTrace(); }
> InetAddress.getLocalHost()获取本机的ip地址的主机名
try { InetAddress a = InetAddress.getLocalHost(); System.out.println(a);//本机用户名-PC/本机Ip } catch (UnknownHostException e) { e.printStackTrace(); }
该类常用的其他几个方法:
try {
InetAddress address=InetAddress.getLocalHost();
System.out.println(address.getHostAddress());//输出ip字符串
System.out.println(address.getHostName());//输出用户名
System.out.println(address.getCanonicalHostName());//输出本机的主机名.权限定域名(lan)
} catch (UnknownHostException e) {
e.printStackTrace();
}
getCanonicalHostName()方法
定义:public String getCanonicalHostName()
该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。
1. 使用 getLocalHost() 创建InetAddress对象
此时getCanonicalHostName方法和getHostName方法得到的都是本机名
2. 使用域名 创建InetAddress对象
使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器
但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名
3. 使用IP地址 创建InetAddress对象
此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。
之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-
portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如 www.oracle.com
相关文章推荐
- Win32+OpenGL计算机图形学光照阴影算法 可控制光源、光照物等位置的移动以及漫游等
- mac android eclipse + adt + sdk
- 编辑距离问题
- request对象和response对象
- 剑指offer.14:调整数组顺序使奇数位于偶数前面
- java类与对象
- Git & Github 一页简明笔记
- 80x86处理器的标志寄存器
- 圆排列问题
- Codevs P1653 种树 2
- BroadcastReceiver广播接收者基础总结
- RSA在Android、vc、java下加解密实现互通。
- GPU编程
- delphi让exe开机自启动
- C语言:指针的几种形式二
- JavaScript作用域以及闭包(二)
- EasyUI - SearchBox 搜索框
- android studio
- Opencv+Kinect2.0获取BodyIndex图像
- <LeetCode><Easy> 38 Count and Say