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

      目录
      相关文章
      |
      26天前
      |
      JSON Java Apache
      非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
      UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
      102 3
      |
      1月前
      |
      Java 程序员
      JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
      在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
      58 9
      |
      1月前
      |
      人工智能 Java 物联网
      JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
      随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
      43 7
      |
      17天前
      |
      Java
      在Java中,接口之间可以继承吗?
      接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
      54 1
      |
      27天前
      |
      Java
      java线程接口
      Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
      39 1
      |
      1月前
      |
      Java 开发者
      JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
      在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
      54 11
      |
      1月前
      |
      Java 开发者
      在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
      在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
      44 4
      |
      1月前
      |
      安全 Java API
      深入探索Java网络编程中的HttpURLConnection:从基础到进阶
      本文介绍了Java网络编程中HttpURLConnection的高级特性,包括灵活使用不同HTTP方法、处理重定向、管理Cookie、优化安全性以及处理大文件上传和下载。通过解答五个常见问题,帮助开发者提升网络编程的效率和安全性。
      |
      1月前
      |
      JSON 安全 算法
      JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
      在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
      56 9
      |
      1月前
      |
      JSON Java API
      JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
      本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
      48 5