Java网络编程从入门到精通(11):使用NetworkI

系统 1732 0

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇: 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);
}
}

  • 测试 1

执行如下命令:

<!--<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 ;
  • 测试 2

执行如下命令:

<!--<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);
}
}

  • 测试 1

执行如下命令:

<!--<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 ;
  • 测试 2

执行如下命令:

<!--<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开发速学宝典》 出版,欢迎定购

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论