网络接口信息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 。
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(); } } }
END