java

位置:IT落伍者 >> java >> 浏览文章

Java网络编程从入门到精通(11):使用NetworkInterface类获得网络接口信息


发布日期:2023年10月26日
 
Java网络编程从入门到精通(11):使用NetworkInterface类获得网络接口信息

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

相关技术专题Java网络编程基础到进阶教程

创建NetworkInterface对象的两个静态方法

NetworkInerface类和InetAddress一样也没有public的构造方法因此必须通过它的两个静态方法来创建NetworkInterface对象可以使用两种方法来创建NetworkInterface对象网络接口名(getByName方法)和IP地址(getByInetAddress方法)

getByName方法

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

publicstaticNetworkInterfacegetByName(Stringname)throwsSocketException

下面的代码是一个显示指定网络接口信息的程序网络接口名通过命令行参数传入

package mynet;

import*;

publicclass MyNetworkInterface

{

publicstaticvoidmain(String[]args)throwsException

{

if(argslength==)

return;

NetworkInterfaceni=NetworkInterfacegetByName(args[]);

Systemoutprintln((ni==null)?网络接口不存在!:ni);

}

}

测试

执行如下命令

javamynetMyNetworkInterfaceeth

运行结果

name:eth(RealtekRTLFamilyPCIFastEthernetNIC)index:addresses:

/;

/;

测试

执行如下命令

javamynetMyNetworkInterfaceabcd

运行结果

网络接口不存在!

getByInetAddress方法

除了可以使用网络接口名来得到网络接口的信息还可以利用getByInetAddress方法来确定一个IP地址属于哪一个网络接口由于getByInetAddress方法必须使用一个InetAddress对象封装的IP地址来作为参数因此在使用getByInetAddress方法之前必须先创建一个InetAddress对象但要注意不能使用远程的IP的域名来创建InetAddress对象否则getByInetAddress将返回nullgetByInetAddress方法的定义如下

publicstaticNetworkInterfacegetByInetAddress(InetAddressaddr)throwsSocketException

下面代码可以确定一个IP地址属于哪一个网络接口这个IP地址通过命令行参数传入

package mynet;

import*;

publicclass MyNetworkInterface

{

publicstaticvoidmain(String[]args)throwsException

{

if(argslength==)return;

InetAddresslocal=InetAddressgetByName(args[]);

NetworkInterfaceni=NetworkInterfacegetByInetAddress(local);

Systemoutprintln((ni==null)?本机不存在此IP地址!:ni);

}

}

测试

执行如下命令

javamynetMyNetworkInterface

运行结果

name:lo(MSTCPLoopbackinterface)index:addresses:

/;

/:::::::;

测试

执行如下命令

javamynetMyNetworkInterface

运行结果

name:ppp(WAN(PPP/SLIP)Interface)index:addresses:

/;

测试使用的IP地址是ADSL连接临时分配给本机的IP地址因此运行结果返回的ppp是ADSL网络接口

得到本机所有的网络接口

NetworkInterface可以通过getNetworkInterfaces方法来枚举本机所有的网络接口我们也可以利用getNetworkInterfaces得到的网络接口来枚举本机的所有IP地址当然也可以通过InetAddress类的getAllByName来得到本机的所有IP地址但getNetworkInterfaces方法可以按网络接口将这些IP地址进行分组这对于只想得到某个网络接口上的所有IP地址是非常有用的getNetworkInterfaces方法的定义如下

publicstaticEnumeration<NetworkInterface>getNetworkInterfaces()throwsSocketException

下面代码演示了如何使用getNetworkInterfaces方法得到本机所有的网络接口

package mynet;

import*;

importjavautil*;

publicclass MyNetworkInterface

{

publicstaticvoidmain(String[]args)throwsException

{

Enumeration<NetworkInterface>nis=NetworkInterfacegetNetworkInterfaces();

while(nishasMoreElements())

Systemoutprintln(nisnextElement());

}

}

运行结果(部分)

name:lo(MSTCPLoopbackinterface)index:addresses:

/;

/:::::::;

name:eth(RealtekRTLFamilyPCIFastEthernetNIC)index:addresses:

/;

/;

name:ppp(WAN(PPP/SLIP)Interface)index:addresses:

/;

上面的运行结果只是一种可能的结果读者在运行上面的程序时根据本机的硬件和软件的配置不同运行结果可能会有所不同

NetworkInterface类的Getter方法

NetworkInterface类提供了三个方法可以分别得到网络接口名(getName方法)网络接口别名(getDisplayName方法)以及和网络接口绑定的所有IP地址(getInetAddresses方法)

getName方法

这个方法用来得到一个网络接口的名称这个名称就是使用getByName方法创建NetworkInterface对象时使用的网络接口名如ethpppgetName方法的定义如下

publicStringgetName()

getDisplayName方法

这个方法可以得到更容易理解的网络接口名也可以将这个网络接口名称为网络接口别名在一些操作系统中(如Unix)getDisplayName方法和getName方法的返回值相同但在Windows中getDisplayName方法一般会返回一个更为友好的名字如Realtek RTL Family PCI Fast Ethernet NICgetDisplayName方法的定义如下

publicStringgetDisplayName()

getInetAddresses方法

NetworkInterface类可以通过getInetAddresse方法以InetAddress对象的形式返回和网络接口绑定的所有IP地址getInetAddresses方法的定义如下

publicEnumeration<InetAddress>getInetAddresses()

上面的代码演示了如果使用上述三个Getter方法

package mynet;

import*;

importjavautil*;

publicclass MyNetworkInterface

{

publicstaticvoidmain(String[]args)throwsException

{

if(argslength==)

return;

NetworkInterfaceni=NetworkInterfacegetByName(args[]);

Systemoutprintln(Name:+nigetName());

Systemoutprintln(DisplayName:+nigetDisplayName());

Enumeration<InetAddress>addresses=nigetInetAddresses();

while(addresseshasMoreElements())

Systemoutprintln(addressesnextElement()getHostAddress());

}

}

测试

执行如下命令

javamynetMyNetworkInterfaceeth

运行结果

Name:eth

DisplayName:RealtekRTLFamilyPCIFastEthernetNIC

               

上一篇:Java的类装载器和命名空间

下一篇:疯狂Java讲义:使用MulticastSocket实现多点广播(2)