Java网络编程net-2-网络接口-NetworkInterface

简介: Java网络编程net-2-网络接口-NetworkInterface

网络接口信息NetworkInterface

从JDK1.4开始,Java提供了一个NetworkInterface类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息。

一、概念

       网络接口指的网络设备的各种接口,我们现今正在使用的网络接口都为以太网接口。它遵循IEEE802.3标准,传输速率通常为10M/100/1000Mbps,可工作在全双工、半双工模式。常见的以太网接口类型有RJ-45接口、RJ-11接口、SC光纤接口、FDDI接口、AUI接口、BNC接口、Console接口等。

好吧,太专业了,按我的理解,就是开放的一个门,负责出入或和外界通讯。

二、NetworkInterface类也是一个 final最终类

这个类可以获取本机所有的物理网络接口和虚拟机等软件创建的逻辑网络接口信息。

三、五个静态方法可以获取到NetworkInterface信息

1.NetworkInerface类和InetAddress一样,也没有public的构造方法。可以使用两种方法来创建NetworkInterface对象:

    • 网络接口名(getByName方法)
    • IP地址(getByInetAddress方法)。
    static NetworkInterface getByIndex(int index) 获取给定索引的网络接口。
    static NetworkInterface getByInetAddress(InetAddress addr) 搜索绑定了指定的Internet协议(IP)地址的网络接口的便捷方法。
    static NetworkInterface getByName(String name)  搜索具有指定名称的网络接口。
    static Enumeration<NetworkInterface>  getNetworkInterfaces()  返回Enumeration此计算机上所有接口中的一个。
    static Stream<NetworkInterface> networkInterfaces() 返回Stream此计算机上所有接口的a 。

    image.gif

    2.getByName方法可以通过网络接口名来创建NetworkInterface对象

    这个网络接口名并不是计算机名,而是用于标识物理或逻辑网络接口的名字,一般是由操作系统设置的。网络接口名在大多数操作系统上(包括Windows、Linux和Unix)是以eth开头,后面是网络接口的索引号,从0开始。如本机安了三块网卡,那么网络接口名就依次是eth0、eth1和eth2。NetworkInterface对象的toString方法可以返回网络接口的名称、显示名和这个网络接口上绑字的所有IP地址等信息。当网络接口名不存在时,getByName返回null。

    3.getByInetAddress方法来确定一个IP地址属于哪一个网络接口。

    由于getByInetAddress方法必须使用一个InetAddress对象封装的IP地址来作为参数,因此,在使用getByInetAddress方法之前,必须先创建一个InetAddress对象。但要注意不能使用远程的IP的域名来创建InetAddress对象,否则getByInetAddress将返回null。

    4.实例方法的三个getter方法

      • getName方法得到一个网络接口的名称。这个名称就是使用getByName方法创建NetworkInterface对象时使用的网络接口名,如eth0、ppp0等。
      • getDisplayName方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如Unix),getDisplayName方法和getName方法的返回值相同,但在Windows中getDisplayName方法一般会返回一个更为友好的名字,如Realtek RTL8139 Family PCI Fast Ethernet NIC。
      • getInetAddresse方法以InetAddress对象的形式返回和网络接口绑定的所有IP地址。
      package com.xing.studyTest.net;
      import java.net.InetAddress;
      import java.net.NetworkInterface;
      import java.net.SocketException;
      import java.net.UnknownHostException;
      import java.util.Enumeration;
      public class Network {
        public static void main(String[] args) {
          try {
            //一、五个静态方法获取接口信息
            //1.NetworkInterface可以通过getNetworkInterfaces方法来枚举本机所有的网络接口
            Enumeration<NetworkInterface> ni = NetworkInterface.getNetworkInterfaces();
            int i = 0;
            while(ni.hasMoreElements()) {
              i++;
              System.out.println("第"+i+"个本地接口:"+ni.nextElement());
            }
            //2.获取给定索引的网络接口
            NetworkInterface ni1 = NetworkInterface.getByIndex(1);
            System.out.println("getByIndex获取本地接口:"+ni1);
            //3.指定名称获取网络接口
            NetworkInterface ni2 = NetworkInterface.getByName("utun0");
            System.out.println("getByName获取本地接口:"+ni2);
            //4.确定一个IP地址属于哪一个网络接口
            try {
              NetworkInterface ni3 = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());
              System.out.println("getByInetAddress获取本地接口:"+ni3);
            } catch (UnknownHostException e) {
              e.printStackTrace();
            }
            //二、实例方法
            System.out.println("getDisplayName获取此网络接口的显示名称"+ni1.getDisplayName());
            System.out.println("getHardwareAddress返回接口的硬件地址(通常为MAC)"+ni1.getHardwareAddress());
            System.out.println("getIndex返回此网络接口的索引"+ni1.getIndex());
            System.out.println("以InetAddress对象的形式返回和网络接口绑定的所有IP地址"+ni1.getInetAddresses());
            System.out.println("getInterfaceAddresses返回此网络接口的全部或子集的列表"+ni1.getInterfaceAddresses());
            System.out.println("getMTU返回此接口的最大传输单位(MTU)"+ni1.getMTU());
            System.out.println("getName获取此网络接口的名称"+ni1.getName());
            System.out.println("getParent返回此接口的父接口"+ni1.getParent());//如果此接口是子接口,或者null是物理(非虚拟)接口或没有父接口,则返回此接口的父NetworkInterface
            System.out.println("getSubInterfaces获得带有与此网络接口相连的所有子接口(也称为虚拟接口)的枚举"+ni1.getSubInterfaces());
            System.out.println("getInetAddresses获取绑定到此网络接口的所有或部分InetAddress的流"+ni1.getInetAddresses());
      //      System.out.println("subInterfaces获取连接到此网络接口的所有子接口(也称为虚拟接口)的流"+ni1.subInterfaces());//Java9以后才有的
            System.out.println("isLoopback返回网络接口是否为回送接口"+ni1.isLoopback());
            System.out.println("isPointToPoint返回网络接口是否为点对点接口"+ni1.isPointToPoint());
            System.out.println("isUp返回网络接口是否已启动并正在运行"+ni1.isUp());
            System.out.println("isVirtual返回此接口是否为虚拟接口(也称为子接口)"+ni1.isVirtual());
            System.out.println("supportsMulticast返回网络接口是否支持多播"+ni1.supportsMulticast());
          } catch (SocketException e) {
            e.printStackTrace();
          }
        }
      }

      image.gif

      END

      目录
      相关文章
      |
      8天前
      |
      数据可视化
      R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
      R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
      17 1
      |
      8天前
      |
      机器学习/深度学习 存储 计算机视觉
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-4
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
      40 11
      |
      4天前
      |
      机器学习/深度学习 存储 算法
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现(下)
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
      18 2
      |
      4天前
      |
      机器学习/深度学习 并行计算 算法
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现(上)
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
      |
      6天前
      |
      存储 安全 Java
      [Java基础面试题] Map 接口相关
      [Java基础面试题] Map 接口相关
      |
      8天前
      |
      机器学习/深度学习 算法 数据可视化
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-3
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
      14 0
      |
      8天前
      |
      并行计算
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-2
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
      11 0
      |
      8天前
      |
      算法 数据可视化
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-1
      r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现
      18 0
      |
      11天前
      |
      监控 Java 开发者
      深入理解 Java 网络编程和 NIO
      【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
      |
      11天前
      |
      Java 开发者
      探索 Java 的函数式接口和 Lambda 表达式
      【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。