NetworkInterface类表示一个由名称例如“eth0”、“net2”和分配给此接口的IP地址列表组成的网络接口。该类提供访问网卡设备的相关信息,例如可以获取网卡名称、IP地址和子网掩码等。
创建NetworkInterface对象
由于NetworkInterface对象表示物理硬件和虚拟地址,所以不能任意构造,而是提供了一些静态工厂方法通过名称、IP地址或者枚举的方式返回与某个网络接口关联的NetworkInterface对象。
1.getByName(String name)方法根据指定名称返回一个NetworkInterface对象。名称的格式与平台有关,在UNIX系统上以太网接口名称的形式为“eth0”、“eth1”等。本地回送地址的名称可能类似“lo”。
public static NetworkInterface getByName(String name) throws SocketException {
if (name == null)
throw new NullPointerException();
return getByName0(name);
}
private native static NetworkInterface getByName0(String name)
throws SocketException;
2.getByInetAddress(InetAddress addr)方法返回一个与指定IP地址绑定的NetworkInterface对象。如果指定的IP地址绑定了多个网络接口,则不确定返回哪个网络接口。在Linux系统中,bonding的含义是将多个物理网卡抽象成一个网卡,能够提升网络吞吐量,实现网络冗余、负载等功能。
public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException {
if (addr == null) {
throw new NullPointerException();
}
if (addr instanceof Inet4Address) {
校验...
} else if (addr instanceof Inet6Address) {
校验...
} else {
throw new IllegalArgumentException("invalid address type: " + addr);
}
return getByInetAddress0(addr);
}
private native static NetworkInterface getByInetAddress0(InetAddress addr)
throws SocketException;
3.getNetworkInterfaces()方法返回一个java.util.Enumeration<NetworkInterface>对象,列出本地主机上所有网络接口。
public static Enumeration<NetworkInterface> getNetworkInterfaces()
throws SocketException {
final NetworkInterface[] netifs = getAll();
return new Enumeration<NetworkInterface>() {
private int i = 0;
public NetworkInterface nextElement() {
if (netifs != null && i < netifs.length) {
NetworkInterface netif = netifs[i++];
return netif;
} else {
throw new NoSuchElementException();
}
}
public boolean hasMoreElements() {
return (netifs != null && i < netifs.length);
}
};
}
获取方法
1.getInetAddresses()方法返回一个java.util.Enumeration<InetAddress>对象,列出与这个网络接口绑定的所有IP地址,包括IPv4地址和IPv6地址。
NetworkInterface networkInterface = NetworkInterface.getByName("lo");
Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
System.out.println(inetAddresses.nextElement());
}
输出:
/127.0.0.1
/0:0:0:0:0:0:0:1
2.getName()方法和getDisplayName()方法返回网络接口在操作系统中的名称,不同的是getName()方法返回的名称仅仅是类似“eth0”这样的代号,而getDisplayName()方法返回的名称还包含厂商名称和网卡具体型号等相关信息。
NetworkInterface networkInterface = NetworkInterface.getByName("eth0");
System.out.println(networkInterface.getName());
System.out.println(networkInterface.getDisplayName());
输出:
eth0
Realtek PCIe GbE Family Controller
3.isUp()方法判断该网络接口是否已经开启并且正常工作。
public boolean isUp() throws SocketException {
return isUp0(name, index);
}
private native static boolean isUp0(String name, int ind) throws SocketException;
4.isLoopback()方法判断该网络接口是否是localhost回环接口,如果一个网络设备是回环接口,那么它永远工作并且还是虚拟的,也就是计算机上并不存在这样的硬件网络设备,如果计算机没有安装物理硬件网卡但安装了Tomcat,就可以使用localhost或者127.0.0.1访问Tomcat。
public boolean isLoopback() throws SocketException {
return isLoopback0(name, index);
}
private native static boolean isLoopback0(String name, int ind) throws SocketException;
5.getMTU()方法返回该网络接口的MTU大小。在网络传输中是以数据包为基本传输单位,可以使用MTU(Maximum Transmission Unit,最大传输单元)来规定网络传输最大数据包的大小,单位为字节。以太网网卡的MTU大多数默认值是1500字节。MTU值设置的大小与传输效率有关,如果MTU设置大值,则传输速度很快,因为发送的数据包数量少了,但延迟很大,因为对方需要一点一点地处理数据;如果MTU设置小值,则传输速度慢,因为发送的数据包数量多了。
public int getMTU() throws SocketException {
return getMTU0(name, index);
}
private native static int getMTU0(String name, int ind) throws SocketException;
6.getSubInterfaces()方法返回一个java.util.Enumeration<NetworkInterface>对象,列出该网络接口的所有子接口。子接口的作用是在不添加新的物理网卡的基础上,基于原有的网络接口设备再创建出一个虚拟的网络接口设备进行通信,这个虚拟的网络接口可以理解成是一个由软件模拟的网卡。Windows系统不支持子接口,而Linux系统支持。
7.isVirtual()方法判断该网络接口是否是虚拟子接口。
8.getParent()方法返回该网络接口的父接口。一个虚拟子接口必须依赖于父接口,也就是所属的硬件网卡。
9.getHardwareAddress()方法以字节数组的形式返回该网络接口的硬件地址,一般是MAC(Media Access Control,媒体访问控制),它是网络设备的唯一ID,采用十六进制表示,一共48位,可以使用“ipconfig -all”命令查看。
NetworkInterface networkInterface = NetworkInterface.getByName("eth0");
System.out.println(networkInterface.getDisplayName());
byte[] addr = networkInterface.getHardwareAddress();
System.out.println(org.apache.tomcat.util.buf.HexUtils.toHexString(addr));
输出:
eth0
Realtek PCIe GbE Family Controller
34f1abdc6efb
10.isPointToPoint()方法判断该网络接口是否是点对点设备。点对点的主要目的是通过拨号或者专线方式建立连接发送数据,是各种主机、网桥和路由器之间简单连接的一种通信解决方案。
11.supportsMulticast()方法判断该网络接口是否支持多播。多播也称为组播,是一种一对多的网络,它可以对某些计算机分配多播类型的IP地址以进行分组,然后只针对这些计算机发送数据。