从
JDK1.4
开始,
Java
提供了一个
NetworkInterface
类。这个类可以得到本机所有的物理网络接口和虚拟机等软件利用本机的物理网络接口创建的逻辑网络接口的信息。
一、
创建
NetworkInterface
对象的两个静态方法
NetworkInerface
类和InetAddress
一样,也没有public
的构造方法。因此,必须通过它的两个静态方法来创建NetworkInterface
对象。可以使用两种方法来创建NetworkInterface
对象:网络接口名(getByName
方法)和IP
地址(getByInetAddress
方法)
。
1. getByName
方法
这个方法可以通过网络接口名来创建NetworkInterface
对象。这个网络接口名并不是计算机名,而是用于标识物理或逻辑网络接口的名字,一般是由操作系统设置的。网络接口名在大多数操作系统上(包括Windows
、Linux
和Unix
)是以eth
开头,后面是网络接口的索引号,从0
开始。如本机安了三块网卡,那么网络接口名就依次是eth0
、eth1
和eth2
。NetworkInterface
对象的toString
方法可以返回网络接口的名称、显示名和这个网络接口上绑字的所有IP
地址等信息。当网络接口名不存在时,getByName
返回null
。getByName
方法定义如下:
public
static
NetworkInterface getByName(String name)
throws
SocketException
下面的代码
是一个显示指定网络接口信息的程序,网络接口名通过命令行参数传入。
package
mynet;
import java.net. * ;
public class MyNetworkInterface1
{
public static void main(String[] args) throws Exception
{
if (args.length == 0 )
return ;
NetworkInterface ni = NetworkInterface.getByName(args[ 0 ]);
System.out.println((ni == null ) ? " 网络接口不存在! " : ni);
}
}
import java.net. * ;
public class MyNetworkInterface1
{
public static void main(String[] args) throws Exception
{
if (args.length == 0 )
return ;
NetworkInterface ni = NetworkInterface.getByName(args[ 0 ]);
System.out.println((ni == null ) ? " 网络接口不存在! " : ni);
}
}
- 测试1
执行如下命令:
java mynet.MyNetworkInterface1 eth0
运行结果:
name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC) index:
4
addresses:
/ 192.168.18.10 ;
/ 192.168.18.20 ;
/ 192.168.18.10 ;
/ 192.168.18.20 ;
- 测试2
执行如下命令:
java mynet.MyNetworkInterface1 abcd
运行结果:
网络接口不存在!
2. getByInetAddress
方法
除了可以使用网络接口名来得到网络接口的信息,还可以利用getByInetAddress
方法来确定一个IP
地址属于哪一个网络接口。由于getByInetAddress
方法必须使用一个InetAddress
对象封装的IP
地址来作为参数,因此,在使用getByInetAddress
方法之前,必须先创建一个InetAddress
对象。但要注意不能使用远程的IP
的域名来创建InetAddress
对象,否则getByInetAddress
将返回null
。getByInetAddress
方法的定义如下:
public
static
NetworkInterface getByInetAddress(InetAddress addr)
throws
SocketException
下面代码
可以确定一个
IP
地址属于哪一个网络接口,这个
IP
地址通过命令行参数传入。
package
mynet;
import java.net. * ;
public class MyNetworkInterface2
{
public static void main(String[] args) throws Exception
{
if (args.length == 0 ) return ;
InetAddress local = InetAddress.getByName(args[ 0 ]);
NetworkInterface ni = NetworkInterface.getByInetAddress(local);
System.out.println((ni == null ) ? " 本机不存在此IP地址! " : ni);
}
}
import java.net. * ;
public class MyNetworkInterface2
{
public static void main(String[] args) throws Exception
{
if (args.length == 0 ) return ;
InetAddress local = InetAddress.getByName(args[ 0 ]);
NetworkInterface ni = NetworkInterface.getByInetAddress(local);
System.out.println((ni == null ) ? " 本机不存在此IP地址! " : ni);
}
}
- 测试1
执行如下命令:
java mynet.MyNetworkInterface2
127.0
.
0.1
运行结果:
name:lo (MS TCP Loopback interface) index:
1
addresses:
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
- 测试2
执行如下命令:
java mynet.MyNetworkInterface2
218.61.151.22
运行结果:
name:ppp0 (WAN (PPP/SLIP) Interface) index:
0
addresses:
/ 218.61.151.22 ;
/ 218.61.151.22 ;
测试
2
使用的
IP
地址
218.61.151.22
是
ADSL
连接临时分配给本机的
IP
地址,因此,运行结果返回的
ppp0
是
ADSL
网络接口。
二、
得到本机所有的网络接口
NetworkInterface
可以通过getNetworkInterfaces
方法来枚举本机所有的网络接口。我们也可以利用getNetworkInterfaces
得到的网络接口来枚举本机的所有IP
地址。当然,也可以通过InetAddress
类的getAllByName
来得到本机的所有IP
地址。但getNetworkInterfaces
方法可以按网络接口将这些IP
地址进行分组,这对于只想得到某个网络接口上的所有IP
地址是非常有用的。getNetworkInterfaces
方法的定义如下:
public
static
Enumeration
<
NetworkInterface
>
getNetworkInterfaces()
throws
SocketException
下面代码
演示了如何使用getNetworkInterfaces
方法得到本机所有的网络接口。
package
mynet;
import java.net. * ;
import java.util. * ;
public class MyNetworkInterface3
{
public static void main(String[] args) throws Exception
{
Enumeration < NetworkInterface > nis = NetworkInterface.getNetworkInterfaces();
while (nis.hasMoreElements())
System.out.println(nis.nextElement());
}
}
import java.net. * ;
import java.util. * ;
public class MyNetworkInterface3
{
public static void main(String[] args) throws Exception
{
Enumeration < NetworkInterface > nis = NetworkInterface.getNetworkInterfaces();
while (nis.hasMoreElements())
System.out.println(nis.nextElement());
}
}
运行结果(部分):
name:lo (MS TCP Loopback interface) index:
1
addresses:
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC ) index: 4 addresses:
/ 192.168.18.10 ;
/ 192.168.18.20 ;
name:ppp0 (WAN (PPP/SLIP) Interface) index: 0 addresses:
/ 218.61.151.22 ;
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC ) index: 4 addresses:
/ 192.168.18.10 ;
/ 192.168.18.20 ;
name:ppp0 (WAN (PPP/SLIP) Interface) index: 0 addresses:
/ 218.61.151.22 ;
上面的运行结果只是一种可能的结果,读者在运行上面的程序
时根据本机的硬件和软件的配置不同,运行结果可能会有所不同。
三、
NetworkInterface
类的
Getter
方法
NetworkInterface
类提供了三个方法可以分别得到网络接口名(getName
方法)
、网络接口别名(getDisplayName
方法)
以及和网络接口绑定的所有IP
地址(getInetAddresses
方法)
。
1. getName
方法
这个方法用来得到一个网络接口的名称。这个名称就是使用getByName
方法创建NetworkInterface
对象时使用的网络接口名,如eth0
、ppp0
等。getName
方法的定义如下:
public
String getName()
2. getDisplayName
方法
这个方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如Unix
),getDisplayName
方法和getName
方法的返回值相同,但在Windows
中getDisplayName
方法一般会返回一个更为友好的名字,如
Realtek RTL8139 Family PCI Fast Ethernet NIC
。getDisplayName
方法的定义如下:
public
String getDisplayName()
3. getInetAddresses
方法
NetworkInterface
类可以通过getInetAddresse
方法以InetAddress
对象的形式返回和网络接口绑定的所有IP
地址。getInetAddresses
方法的定义如下:
public
Enumeration
<
InetAddress
>
getInetAddresses()
上面的代码
演示了如果使用上述三个Getter
方法。
package
mynet;
import java.net. * ;
import java.util. * ;
public class MyNetworkInterface4
{
public static void main(String[] args) throws Exception
{
if (args.length == 0 )
return ;
NetworkInterface ni = NetworkInterface.getByName(args[ 0 ]);
System.out.println( " Name: " + ni.getName());
System.out.println( " DisplayName: " + ni.getDisplayName());
Enumeration < InetAddress > addresses = ni.getInetAddresses();
while (addresses.hasMoreElements())
System.out.println(addresses.nextElement().getHostAddress());
}
}
import java.net. * ;
import java.util. * ;
public class MyNetworkInterface4
{
public static void main(String[] args) throws Exception
{
if (args.length == 0 )
return ;
NetworkInterface ni = NetworkInterface.getByName(args[ 0 ]);
System.out.println( " Name: " + ni.getName());
System.out.println( " DisplayName: " + ni.getDisplayName());
Enumeration < InetAddress > addresses = ni.getInetAddresses();
while (addresses.hasMoreElements())
System.out.println(addresses.nextElement().getHostAddress());
}
}
1.
测试
执行如下命令:
java mynet.MyNetworkInterface4 eth0
运行结果:
Name: eth0
DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC
192.168.18.10
192.168.18.20
DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC
192.168.18.10
192.168.18.20
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214458,如需转载请自行联系原作者