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

      目录
      相关文章
      |
      6月前
      |
      JSON 移动开发 网络协议
      Java网络编程:Socket通信与HTTP客户端
      本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
      |
      6月前
      |
      消息中间件 缓存 前端开发
      从资损百万到零事故:Java 接口幂等设计的艺术与实践
      在分布式系统中,重复请求常引发严重资损,如支付双扣、库存超卖等问题,其根源在于接口缺乏幂等性设计。本文通过真实案例揭示幂等性的重要性,并详解8种主流解决方案,涵盖唯一请求ID、乐观锁、悲观锁、状态机等,帮助开发者构建稳定系统,保障业务一致性。无论你是架构师还是开发工程师,都能从中获得实战指导,有效规避重复调用带来的风险。
      540 2
      |
      6月前
      |
      数据采集 JSON Java
      Java爬虫获取1688店铺所有商品接口数据实战指南
      本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
      |
      7月前
      |
      JSON 监控 API
      在线网络PING接口检测服务器连通状态免费API教程
      接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
      807 0
      |
      5月前
      |
      算法 安全 Java
      除了类,Java中的接口和方法也可以使用泛型吗?
      除了类,Java中的接口和方法也可以使用泛型吗?
      189 11
      |
      4月前
      |
      JSON 网络协议 安全
      【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
      几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
      247 1
      |
      4月前
      |
      Java Go 开发工具
      【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
      抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
      254 0
      |
      4月前
      |
      JSON 网络协议 安全
      【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
      几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
      261 1
      |
      6月前
      |
      存储 缓存 安全
      Java集合框架(二):Set接口与哈希表原理
      本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
      414 23
      |
      4月前
      |
      机器学习/深度学习 分布式计算 Java
      Java与图神经网络:构建企业级知识图谱与智能推理系统
      图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
      451 0