本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:
Java网络编程从入门到精通(10):Inet4Address类和Inet6Address类
从
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
方法定义如下:
下面的代码
是一个显示指定网络接口信息的程序,网络接口名通过命令行参数传入。
import java.net. * ;
public class MyNetworkInterface1
{
public static void main(String[]args) throws Exception
{
if (args.length == 0 )
return ;
NetworkInterfaceni = NetworkInterface.getByName(args[ 0 ]);
System.out.println((ni == null ) ? " 网络接口不存在! " :ni);
}
}
- 测试 1
执行如下命令:
运行结果:
/ 192.168.18.10 ;
/ 192.168.18.20 ;
- 测试 2
执行如下命令:
运行结果:
2.getByInetAddress 方法
除了可以使用网络接口名来得到网络接口的信息,还可以利用
getByInetAddress
方法来确定一个
IP
地址属于哪一个网络接口。由于
getByInetAddress
方法必须使用一个
InetAddress
对象封装的
IP
地址来作为参数,因此,在使用
getByInetAddress
方法之前,必须先创建一个
InetAddress
对象。但要注意不能使用远程的
IP
的域名来创建
InetAddress
对象,否则
getByInetAddress
将返回
null
。
getByInetAddress
方法的定义如下:
下面代码
可以确定一个
IP
地址属于哪一个网络接口,这个
IP
地址通过命令行参数传入。
import java.net. * ;
public class MyNetworkInterface2
{
public static void main(String[]args) throws Exception
{
if (args.length == 0 ) return ;
InetAddresslocal = InetAddress.getByName(args[ 0 ]);
NetworkInterfaceni = NetworkInterface.getByInetAddress(local);
System.out.println((ni == null ) ? " 本机不存在此IP地址! " :ni);
}
}
- 测试 1
执行如下命令:
运行结果:
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
- 测试 2
执行如下命令:
运行结果:
/ 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
方法的定义如下:
下面代码
演示了如何使用
getNetworkInterfaces
方法得到本机所有的网络接口。
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());
}
}
运行结果(部分):
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
name:eth0(RealtekRTL8139FamilyPCIFastEthernetNIC)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 方法的定义如下:
2.getDisplayName 方法
这个方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如
Unix
),
getDisplayName
方法和
getName
方法的返回值相同,但在
Windows
中
getDisplayName
方法一般会返回一个更为友好的名字,如
Realtek RTL8139 Family PCI Fast Ethernet NIC
。
getDisplayName
方法的定义如下:
3.getInetAddresses 方法
NetworkInterface
类可以通过
getInetAddresse
方法以
InetAddress
对象的形式返回和网络接口绑定的所有
IP
地址。
getInetAddresses
方法的定义如下:
上面的代码
演示了如果使用上述三个
Getter
方法。
import java.net. * ;
import java.util. * ;
public class MyNetworkInterface4
{
public static void main(String[]args) throws Exception
{
if (args.length == 0 )
return ;
NetworkInterfaceni = 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. 测试
执行如下命令:
运行结果:
DisplayName:RealtekRTL8139FamilyPCIFastEthernetNIC
192.168.18.10
192.168.18.20
下一篇: Java网络编程从入门到精通(12):使用isReachable方法探测主机是否可以连通
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!
《银河系列原创教程》 发布
《Java Web开发速学宝典》 出版,欢迎定购