Java中InetAddress类的使用

 更新时间:2023年09月03日 09:52:50   作者:WM之辈  
InetAddress类是Java中用于表示IP地址的类,本文就来介绍一下Java中InetAddress类的使用,具有一定的参考价值,感兴趣的可以了解一下

概念: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类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 老生常谈Java中List与ArrayList的区别

    老生常谈Java中List与ArrayList的区别

    大家都知道List是接口,ArrayList是List接口的一个实现类,接下来通过本文给大家介绍Java中List与ArrayList的区别,需要的朋友可以参考下
    2022-08-08
  • Java SpringBoot 中的操作事务

    Java SpringBoot 中的操作事务

    这篇文章主要介绍了Java SpringBoot 中的操作事务,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Spring Security基于过滤器实现图形验证码功能

    Spring Security基于过滤器实现图形验证码功能

    验证码就是为了防止恶意用户采用暴力重试的攻击手段而设置的一种防护措施,接下来在Spring Security的环境中,我们可以用两种方案实现图形验证码,具体实现方法跟随小编一起看看吧
    2021-09-09
  • elasticsearch节点间通信的基础transport启动过程

    elasticsearch节点间通信的基础transport启动过程

    这篇文章主要为大家介绍了elasticsearch节点间通信的基础transport启动过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 实例解析Java日期格式工具类DateUtil.java

    实例解析Java日期格式工具类DateUtil.java

    本文主要对Java日期格式工具类DateUtil.java进行实例解析。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • java链表的头插法和尾插法详解

    java链表的头插法和尾插法详解

    本文介绍了链表的基本概念,包括节点类Listnode和链表类Linklist,头插法和尾插法是两种常见的插入节点的方法,分别通过头指针和游标来实现,通过示例代码和测试,展示了链表的创建和操作过程
    2024-12-12
  • Java中自定义类的实现详解

    Java中自定义类的实现详解

    自定义类是Java中最基本、也是最重要的组成部分之一,使用者可以根据需求创建自己的数据类型,从而更加高效地构建程序,本文就来为大家详细讲讲Java中自定义类的实现与使用吧
    2023-05-05
  • Java开发中的容器概念、分类与用法深入详解

    Java开发中的容器概念、分类与用法深入详解

    这篇文章主要介绍了Java开发中的容器概念、分类与用法,结合实例形式较为详细的分析了java容器的相关概念、分类、使用方法与注意事项,需要的朋友可以参考下
    2017-11-11
  • Jdk中没有jre文件夹怎么办?如何解决?

    Jdk中没有jre文件夹怎么办?如何解决?

    这篇文章主要介绍了Jdk中没有jre文件夹怎么办?如何解决的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 图文示例详解Lucene数据模型查询原理

    图文示例详解Lucene数据模型查询原理

    这篇文章主要为大家通过图文示例详解Lucene数据模型查询原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论