TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
从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);
}
}
测试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
;
测试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);
}
}
测试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
;
测试2
执行如下命令:
java mynet.MyNetworkInterface2
218.61.151.22
运行结果:
name:ppp0 (WAN (PPP/SLIP) Interface) index:
0
addresses:
/
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());
}
}
运行结果(部分):
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
;
... ...
上面的运行结果只是一种可能的结果,读者在运行上面的程序
时根据本机的硬件和软件的配置不同,运行结果可能会有所不同。
三、
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());
}
}
1.
测试
执行如下命令:
java mynet.MyNetworkInterface4 eth0
运行结果:
Name: eth0
DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC
192.168.18.10
192.168.18.20
本文出自 “软件改变整个宇宙” 博客,请务必保留此出处http://androidguy.blog.51cto.com/974126/214458
源码下载:http://file.javaxxz.com/2014/11/6/000416125.zip |
|