Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 320|回复: 0

[网络编程学习]Java网络编程从入门到精通(11)获取网络接口信息

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 00:04:16 | 显示全部楼层 |阅读模式
    从JDK1.4开始,java提供了一个NetworkInterface类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息。

    一、创建NetworkInterface对象的两个静态方法 NetworkInerface类和InetAddress一样,也没有public的构造方法。因此,必须通过它的两个静态方法来创建NetworkInterface对象。可以使用两种方法来创建NetworkInterface对象:网络接口名(getByName方法)和IP地址(getByInetAddress方法)。 1.?getByName方法     这个方法可以通过网络接口名来创建NetworkInterface对象。这个网络接口名并不是计算机名,而是用于标识物理或逻辑网络接口的名字,一般是由操作系统设置的。网络接口名在大多数操作系统上(包括Windows、Linux和Unix)是以eth开头,后面是网络接口的索引号,从0开始。
      
       
       
         
       

         
       
      
        如本机安了三块网卡,那么网络接口名就依次是eth0、eth1和eth2。NetworkInterface对象的toString方法可以返回网络接口的名称、显示名和这个网络接口上绑字的所有IP地址等信息。当网络接口名不存在时,getByName返回null。getByName方法定义如下:

      
       
          
      public
       
      static
       NetworkInterface getByName(String name)
      throws
       SocketException
      
      

      下面的代码
      是一个显示指定网络接口信息的程序,网络接口名通过命令行参数传入。

      
      
       
      package
       mynet;


      import
       java.net.
      *
      ;


      public
       
      class
       MyNetworkInterface1
    {
         
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
         {
             
      if
       (args.length
      ==
       
      0
      )
                
      return
      ;
             NetworkInterface ni
      =
       NetworkInterface.getByName(args[
      0
      ]);
             System.out.println((ni
      ==
       
      null
      )
      ?
       
      "
      网络接口不存在!
      "
       : ni);
         }
    }

      
      
      
      测试1  
      

      执行如下命令:
      
      
       
      java mynet.MyNetworkInterface1 eth0
      

      运行结果:
      
      
       
      name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC) index:
      4
       addresses:
    /
      192.168.18.10
      ;

      /
      192.168.18.20
      ;
      
      
      测试2  
      

      执行如下命令:
      
      
       
      java mynet.MyNetworkInterface1 abcd
      

      运行结果:
      
      
       
      网络接口不存在!

      



      2. getByInetAddress
      方法
      

          
      除了可以使用网络接口名来得到网络接口的信息,还可以利用getByInetAddress
      方法来确定一个IP
      地址属于哪一个网络接口。由于getByInetAddress
      方法必须使用一个InetAddress
      对象封装的IP
      地址来作为参数,因此,在使用getByInetAddress
      方法之前,必须先创建一个InetAddress
      对象。但要注意不能使用远程的IP
      的域名来创建InetAddress
      对象,否则getByInetAddress
      将返回null
      。getByInetAddress
      方法的定义如下:


      
      
       
      public
       
      static
       NetworkInterface getByInetAddress(InetAddress addr)
      throws
       SocketException

      
      

          
      下面代码
      可以确定一个
      IP
      地址属于哪一个网络接口,这个
      IP
      地址通过命令行参数传入。


      
      
       
      package
       mynet;


      import
       java.net.
      *
      ;


      public
       
      class
       MyNetworkInterface2
    {

         
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
         {
             
      if
      (args.length
      ==
       
      0
      )
      return
      ;
             InetAddress local
      =
       InetAddress.getByName(args[
      0
      ]);
             NetworkInterface ni
      =
       NetworkInterface.getByInetAddress(local);
             System.out.println((ni
      ==
       
      null
      )
      ?
       
      "
      本机不存在此IP地址!
      "
       : ni);        
         }
    }

      
      
      
      测试1  
      

      执行如下命令:
      
      
       
      java mynet.MyNetworkInterface2
      127.0
      .
      0.1
      

      运行结果:
      
      
       
      name:lo (MS TCP Loopback interface) index:
      1
       addresses:
    /
      127.0.0.1
      ;

      /
      0
      :
      0
      :
      0
      :
      0
      :
      0
      :
      0
      :
      0
      :
      1
      ;

      
      
      测试2  
      

      执行如下命令:
      
      
       
      java mynet.MyNetworkInterface2
      218.61.151.22
      

      运行结果:
      
      
       
      name:ppp0 (WAN (PPP/SLIP) Interface) index:
      0
       addresses:
    /
      218.61.151.22
      ;
      

          
      测试
      2
      使用的
      IP
      地址
      218.61.151.22
      是
      ADSL
      连接临时分配给本机的
      IP
      地址,因此,运行结果返回的
      ppp0
      是
      ADSL
      网络接口。
      
      

      二、
      得到本机所有的网络接口
      

          NetworkInterface
      可以通过getNetworkInterfaces
      方法来枚举本机所有的网络接口。我们也可以利用getNetworkInterfaces
      得到的网络接口来枚举本机的所有IP
      地址。当然,也可以通过InetAddress
      类的getAllByName
      来得到本机的所有IP
      地址。但getNetworkInterfaces
      方法可以按网络接口将这些IP
      地址进行分组,这对于只想得到某个网络接口上的所有IP
      地址是非常有用的。getNetworkInterfaces
      方法的定义如下:

      
      
       
      public
       
      static
       Enumeration
      <
      NetworkInterface
      >
       getNetworkInterfaces()
      throws
       SocketException
      
      

          下面代码
      演示了如何使用getNetworkInterfaces
      方法得到本机所有的网络接口。

      
      
       
      package
       mynet;


      import
       java.net.
      *
      ;

      import
       java.util.
      *
      ;


      public
       
      class
       MyNetworkInterface3
    {
         
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
         {
             Enumeration
      <
      NetworkInterface
      >
       nis
      =
       NetworkInterface.getNetworkInterfaces();
             
      while
       (nis.hasMoreElements())
                 System.out.println(nis.nextElement());
         }
    }

      
      

      运行结果(部分):
      
      
       
      name:lo (MS TCP Loopback interface) index: 1 addresses:
    /127.0.0.1
      ;

      /0:0:0:0:0:0:0:1
      ;

      name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC ) index: 4 addresses:
    /192.168.18.10
      ;

      /192.168.18.20
      ;

      name:ppp0 (WAN (PPP/SLIP) Interface) index: 0 addresses:
    /218.61.151.22
      ;

      ... ...
      

          
      上面的运行结果只是一种可能的结果,读者在运行上面的程序
      时根据本机的硬件和软件的配置不同,运行结果可能会有所不同。

      

      
    三、

      NetworkInterface
      类的
      Getter
      方法
      

          NetworkInterface
      类提供了三个方法可以分别得到网络接口名(getName
      方法)
      、网络接口别名(getDisplayName
      方法)
      以及和网络接口绑定的所有IP
      地址(getInetAddresses
      方法)
      。
      
      

      1. getName
      方法
      

      这个方法用来得到一个网络接口的名称。这个名称就是使用getByName
      方法创建NetworkInterface
      对象时使用的网络接口名,如eth0
      、ppp0
      等。getName
      方法的定义如下:
      
      
       
      public
       String getName()
      
      

      2. getDisplayName
      方法
      

      这个方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如Unix
      ),getDisplayName
      方法和getName
      方法的返回值相同,但在Windows
      中getDisplayName
      方法一般会返回一个更为友好的名字,如
      Realtek RTL8139 Family PCI Fast Ethernet NIC
      。getDisplayName
      方法的定义如下:

      
      
       
      public
       String getDisplayName()
      
      

      3. getInetAddresses
      方法
      

      NetworkInterface
      类可以通过getInetAddresse
      方法以InetAddress
      对象的形式返回和网络接口绑定的所有IP
      地址。getInetAddresses
      方法的定义如下:

      
      
       
      public
       Enumeration
      <
      InetAddress
      >
       getInetAddresses()
      
      

      上面的代码
      演示了如果使用上述三个Getter
      方法。

      
      
       
      package
       mynet;


      import
       java.net.
      *
      ;

      import
       java.util.
      *
      ;


      public
       
      class
       MyNetworkInterface4
    {
         
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
         {
             
      if
       (args.length
      ==
       
      0
      )
                
      return
      ;
             NetworkInterface ni
      =
       NetworkInterface.getByName(args[
      0
      ]);
             System.out.println(
      "
      Name:
      "
       
      +
       ni.getName());
             System.out.println(
      "
      DisplayName:
      "
       
      +
       ni.getDisplayName());
             Enumeration
      <
      InetAddress
      >
       addresses
      =
       ni.getInetAddresses();
             
      while
       (addresses.hasMoreElements())
                 System.out.println(addresses.nextElement().getHostAddress());
         }
    }

      
      

      1.
      测试
      

      执行如下命令:
      
      
       
      java mynet.MyNetworkInterface4 eth0
      

      运行结果:
      
      
       
      Name: eth0
    DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC

      192.168.18.10
      

      192.168.18.20
      

      
    本文出自 “软件改变整个宇宙” 博客,请务必保留此出处http://androidguy.blog.51cto.com/974126/214458



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/6/000416125.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:25 , Processed in 0.298905 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表