本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇: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方法定义如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
static
NetworkInterfacegetByName(Stringname)
throws
SocketException
下面的代码是一个显示指定网络接口信息的程序,网络接口名通过命令行参数传入。
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
package
mynet;
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);
}
}
执行如下命令:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
javamynet.MyNetworkInterface1eth0
运行结果:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
name:eth0(RealtekRTL8139FamilyPCIFastEthernetNIC)index:
4
addresses:
/
192.168.18.10
;
/
192.168.18.20
;
执行如下命令:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
javamynet.MyNetworkInterface1abcd
运行结果:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
网络接口不存在!
2.getByInetAddress方法
除了可以使用网络接口名来得到网络接口的信息,还可以利用getByInetAddress方法来确定一个IP地址属于哪一个网络接口。由于getByInetAddress方法必须使用一个InetAddress对象封装的IP地址来作为参数,因此,在使用getByInetAddress方法之前,必须先创建一个InetAddress对象。但要注意不能使用远程的IP的域名来创建InetAddress对象,否则getByInetAddress将返回null。getByInetAddress方法的定义如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
static
NetworkInterfacegetByInetAddress(InetAddressaddr)
throws
SocketException
下面代码可以确定一个IP地址属于哪一个网络接口,这个IP地址通过命令行参数传入。
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
package
mynet;
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);
}
}
执行如下命令:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
javamynet.MyNetworkInterface2
127.0
.
0.1
运行结果:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
name:lo(MSTCPLoopbackinterface)index:
1
addresses:
/
127.0.0.1
;
/
0
:
0
:
0
:
0
:
0
:
0
:
0
:
1
;
执行如下命令:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
javamynet.MyNetworkInterface2
218.61.151.22
运行结果:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
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方法的定义如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
static
Enumeration
<
NetworkInterface
>
getNetworkInterfaces()
throws
SocketException
下面代码演示了如何使用getNetworkInterfaces方法得到本机所有的网络接口。
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
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());
}
}
运行结果(部分):
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
name:lo(MSTCPLoopbackinterface)index:
1
addresses:
/
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方法的定义如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
StringgetName()
2.getDisplayName方法
这个方法可以得到更容易理解的网络接口名,也可以将这个网络接口名称为网络接口别名。在一些操作系统中(如Unix),getDisplayName方法和getName方法的返回值相同,但在Windows中getDisplayName方法一般会返回一个更为友好的名字,如Realtek RTL8139 Family PCI Fast Ethernet NIC。getDisplayName方法的定义如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
StringgetDisplayName()
3.getInetAddresses方法
NetworkInterface类可以通过getInetAddresse方法以InetAddress对象的形式返回和网络接口绑定的所有IP地址。getInetAddresses方法的定义如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
public
Enumeration
<
InetAddress
>
getInetAddresses()
上面的代码演示了如果使用上述三个Getter方法。
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
package
mynet;
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. 测试
执行如下命令:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
javamynet.MyNetworkInterface4eth0
运行结果:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->
Name:eth0
DisplayName:RealtekRTL8139FamilyPCIFastEthernetNIC
192.168.18.10
192.168.18.20
下一篇:
Java网络编程从入门到精通(12):使用isReachable方法探测主机是否可以连通
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!
《银河系列原创教程》发布
《Java Web开发速学宝典》出版,欢迎定购