简述:
要知道,ip地址是ip使用了32位(ipv4)和128位(ipv6)无符号数字,代表了每一台机械的在网络中的位置,即属于唯一标识符。属于网络中的传输层协议TCP/UDP的基础;在Java中,常用InetAddress类来对ip的封装,在Java.net包下许多类都涉及了InetAddress,包括了Socket,ServerSocket等。
InetAddress类详解:
InetAddress类的对象包含了以数字形式的ip地址和主机名(当通过域名构造InetAddress对象并启动反向解析域名功能时候)。
InetAddress对域名的解析其原理是使用本地机器配置或者网络命名服务(如域名系统(DNS),或者网络信息服务(NIS))实现的。
对于DNS来说,通常本地机器向DNS服务器发生查询请求,服务器根据一系列操作,返回对应的IP地址,为了提高性能效率,本地通常会缓存主机名和ip地址,,当查询相同的ip地址时候,就无需再一次请求DNS服务器。对于Java.net.InetAddress也采用了相同策略,如果解析不成功的域名会被缓存以提高性能。
其中,InetAddress类还包含了两个子类:分别是Inet4Address和Inet6Address他们分别代表ipv4地址和ipv6地址。
使用ip地址创建InetAddress对象(例如使用静态方法getByAddress(),getByName(),getAllByName())时,无需访问DNS服务器。所以DNS服务器域名查找工作由getHostName()完成,当IP地址不存在或者DNS服务器不允许对ip地址和域名映射的时候,则返回IP地址。
例如:InetAddres i=InetAddress.getByName(“127.0.0.1”)
使用域名创建InetAddress对象时候,使用getHostName()也无需访问DNS服务器,直接将域名调用给InetAddress对象。
使用getLocalHost() / getCanonicalHostName()创建对象:
getCanonicalHostName()和getLocalHost() 得到的是本地主机名字;
使用域名创建对象:
getByName(“域名”),创建对象时无需访问DNS服务器。
使用ip地址创建对象:
getCanonicalHostName()和getLocalHost() 此时返回的时主机名。
知识来源:
https://blog.csdn.net/xiaozhu0301/article/details/49205931