Java中InetAddress类的使用
作者:WM之辈
概念:InetAddress类是 Java 中用于表示 IP 地址的类。它提供了一种标准的方法来处理 IP 地址,无论是 IPv4 还是 IPv6 地址。InetAddress 类位于 java.net 包中,是 Java 网络编程的一部分。
常用方法:
getLocalHost()
:这个方法获取本地主机的InetAddress
对象,它表示当前计算机。在你的示例中,你获取了本地主机的InetAddress
对象并打印了它。getByName(String host)
:这个方法根据指定的主机名或域名获取对应的InetAddress
对象。在你的示例中,你使用了两个不同的主机名(本地主机名和百度域名)来获取相应的InetAddress
对象,并打印了它们。getHostName()
:这个方法用于获取InetAddress
对象的主机名。在你的示例中,你使用host2
对象(百度域名)调用了getHostName()
方法,以获取主机名并将其打印出来。getHostAddress()
:这个方法用于获取InetAddress
对象的 IP 地址。在你的示例中,你使用host2
对象(百度域名)调用了getHostAddress()
方法,以获取 IP 地址并将其打印出来。
代码:
public class API_ { public static void main(String[] args) throws UnknownHostException { //获取本机 InetAddress 对象 getLocalHost InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost);//LAPTOP-U9K8AF0S/172.21.202.203 获取到主机的信息(主机名和ip地址) //根据指定主机名/域名获取 ip 地址对象 InetAddress host1 = InetAddress.getByName("LAPTOP-U9K8AF0S");//LAPTOP-U9K8AF0S主机名 System.out.println(host1);//LAPTOP-U9K8AF0S/172.21.202.203,通过主机名来获取到ip地址,当然这边输出的是主机名和ip地址 System.out.println(host1.getHostAddress());//172.21.202.203,获取到ip地址 InetAddress host2 = InetAddress.getByName("www.baidu.com");//www.baidu.com域名 System.out.println(host2);//www.baidu.com/153.3.238.102,通过域名来获取ip地址,当然这边输出的是域名和ip地址 System.out.println(host2.getHostAddress());//153.3.238.102,获取ip地址 } }
InetAddress的常用方法
1.public String getHostName()
获得该InetAddress对象的主机名称
2.public String getCanonicalHostName()
获取此IP地址的全限定域名
3.public bytes[] getHostAddress()
获取该InetAddress对象对应的IP地址字符串
4.public static InetAddress getLocalHost()
获取本机对应的InetAddress对象
5.public static InetAddress getByName(String host)
根据主机获得对应的InetAddress对象,参数host可以是IP地址或域名
6.public static InetAddress[] getAllByName(String host)
根据主机获得对应的InetAddress对象
7.public static InetAddress getByAddress(byte[] addr)
获取addr所封装的IP地址对应的Inet Address对象
8.public boolean isReachable(int timeout)
判断是否可以到达该地址
示例
1.小DEMO
通过一个demo来演示一下这些方法叭
package TEMP.Temp3; //使用以上方法的小demo import java.net.InetAddress; import java.net.UnknownHostException; public class InetAddressDemo { public static void main(String[] args) { try{ //获取自己本机地址信息 InetAddress localIp=InetAddress.getLocalHost(); //1获取此IP地址的全限定域名 System.out.println("1.localIp.getCanonicalHostName()=" + localIp.getCanonicalHostName()); //2获取该InetAddress对象对应的IP地址字符串 System.out.println("2.localIp.getHostAddress()=" + localIp.getHostAddress()); //3获得该InetAddress对象的主机名称 System.out.println("3.localIp.getHostName()=" + localIp.getHostName()); System.out.println("4.localIp.toString()="+localIp.toString()); //5.判断是否可以到达该地址 System.out.println("5.localIp.isReachable(5000)=" + localIp.isReachable(5000)); System.out.println("===================================="); System.out.println("===================================="); //获取指定域名地址的信息([eg]百度) InetAddress baiduip = InetAddress.getByName("www.baidu.com"); //1获取此IP地址的全限定域名 System.out.println("1.baiduIp.getCanonicalHostName()=" + baiduip.getCanonicalHostName()); //2获取该InetAddress对象对应的IP地址字符串 System.out.println("2.baiduIp.getHostAddress()=" + baiduip.getHostAddress()); //3获得该InetAddress对象的主机名称 System.out.println("3.baiduIp.getHostName()=" + baiduip.getHostName()); System.out.println("4.baiduIp.toString()="+baiduip.toString()); //5判断是否可以到达该地址 System.out.println("5.baiduIp.isReachable(5000)=" + baiduip.isReachable(5000)); System.out.println("===================================="); System.out.println("===================================="); //获取指定原始IP地址信息 InetAddress ip = InetAddress.getByAddress(new byte[]{127,0,0,1}); // InetAddress ip = InetAddress.getByName("127.0.0.1"); System.out.println("1.ip.getCanonicalHostName()=" + ip.getCanonicalHostName()); System.out.println("2.ip.getHostAddress()= "+ ip.getHostAddress()); System.out.println("3.ip.getHostName()="+ ip.getHostName()); System.out.println("4.ip.toString()="+ ip.toString()); System.out.println("5.ip.isReachable(5000)=" + ip.isReachable(5000)); }catch(UnknownHostException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } } //输出结果 // 1.localIp.getCanonicalHostName()=shizhanli.lan // 2.localIp.getHostAddress()=192.168.30.151 // 3.localIp.getHostName()=shizhanli // 4.localIp.toString()=shizhanli/192.168.30.151 // 5.localIp.isReachable(5000)=true // ==================================== // ==================================== // 1.baiduIp.getCanonicalHostName()=14.215.177.38 // 2.baiduIp.getHostAddress()=14.215.177.38 // 3.baiduIp.getHostName()=www.baidu.com // 4.baiduIp.toString()=www.baidu.com/14.215.177.38 // 5.baiduIp.isReachable(5000)=true // ==================================== // ==================================== // 1.ip.getCanonicalHostName()=localhost // 2.ip.getHostAddress()= 127.0.0.1 // 3.ip.getHostName()=localhost // 4.ip.toString()=localhost/127.0.0.1 // 5.ip.isReachable(5000)=true
2.给定地址,找到主机名称
package TEMP.Temp3; //给定地址,找出主机名 import java.net.InetAddress; import java.net.UnknownHostException; public class ReverseTest { public static void main(String[] args) throws UnknownHostException { InetAddress ia = InetAddress.getByName("192.168.30.151"); System.out.println(ia.getCanonicalHostName()); } } //输出结果: //shizhanli.lan
3.找到本地机器的IP地址
package TEMP.Temp3; //找到本地机器的IP地址 import java.net.InetAddress; import java.net.UnknownHostException; public class MyAddress { public static void main(String[] args) { try{ InetAddress me = InetAddress.getLocalHost(); String dottedQuad = me.getHostAddress();//创建一个String类型的变量来接受返回的ip地址 System.out.println("My address is " + dottedQuad); }catch (UnknownHostException ex){ System.out.println("I'm sorry.I don't know my own address."); } } } //输出:My address is 192.168.30.151
InetAddress缓存
InetAddress类具有高速缓存以存储成功以及不成功的主机名解析。
默认情况下,安装安全管理器时,为了防止DNS欺骗攻击,主机名正确解决方案的结果将永久缓存。
当没有安装安全管理器时,默认的行为是缓存条目以获得有限的(实现依赖的)时间段。
不成功的主机名解析的结果被缓存很短的时间(10秒),以提高性能。
如果不需要默认行为,则可以将Java安全属性设置为不同的生存时间(TTL)值进行正缓存。 同样,系统管理员可以在需要时配置不同的缓存缓存TTL值。
Inet4Address和Inet6Address
Java使用了两个类Inet4Address和Inet6Address,来区分IPv4地址和IPv6地址.
1.public final class Inet4Address extends InetAddress
2.public final class Inet6Address extends InetAddress
地址类型
有些IP地址和地址模式有特殊的含义。Java提供了许多方法来测试InetAddress对象是否符合其中某个标准。
1.public boolean isAnylocalAdress()
如果是通配地址,方法返回true。通配地址可以匹配本地系统中的任何地址,在IPv4中,通配地址是0.0.0.0。在IPv6中,通配地址是0:0:0:0:0:0:0:0。
2.public boolean isLoopbackAdress()
如果是回送地址,方法返回true。回送地址直接在IP层连接同一台计算机,而不使用任务物理硬件。在IPv4中,这个地址是127.0.0.1。在IPv6中,这个回送地址是0:0:0:0:0:0:0:1。
3.public boolean isLinkLocalAddress()
如果地址是一个IPv6本地链接地址,方法返回true,否则返回false。
4.public boolean isSiteLocalAddress()
如果地址是一个IPv6本地网络地址,方法返回true,否则返回false。
5.public boolean isMulticastAddress()
如果地址是一个组播地址,方法返回true,否则返回false。
6.public boolean isMCGlobal()
如果地址是全球组播地址,方法返回true,否则返回false。
7.public boolean isMCNodeLocal()
如果地址是一个本地接口组播地址,方法返回true,否则返回false。
8.public boolean isMCLinkLocal()
如果地址是一个子网范围组播地址,方法返回true,否则返回false。
9.public boolean isMCSiteLocal()
如果地址是一个网站范围组播地址,方法返回true,否则返回false。
10.public boolean isMCOrgLocal()
如果地址是一个组织范围组播地址,方法返回true,否则返回false。
测试可达性
InetAddress类有两个isReachable()方法,可以测试一个特定节点对当前主机是否可达哦。
方法①public boolean isReachable(int timeout) throws IOException
方法②public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException
小小解析:
这些方法尝试使用traceroute查看指定地址是否可达。如果主机在timeout毫秒内响应,则方法返回true;否则返回false。如果出现网络错误则抛出IOException异常。第二个方法还允许指定从哪个本地网络接口建立连接,以及“生存时间”。
Object方法
1.public boolean equals(Object o)
若与一个InetAddress对象有相同的IP地址,并不要求这两个对象有相同的主机名,就返回true,否则返回false。
2.public int hasCode()
只根据IP地址来计算,不考虑主机名
3.public String toString()
生成的字符串有两种格式:主机名或点分四段地址。
到此这篇关于Java中InetAddress类的使用的文章就介绍到这了,更多相关Java InetAddress类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!