天天看點

Java網絡程式設計從入門到精通(11):使用NetworkInterface類獲得網絡接口資訊

本文為原創,如需轉載,請注明作者和出處,謝謝!

    從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位址通過指令行參數傳入。

public class MyNetworkInterface2

        if(args.length == 0) return;

        InetAddress local = InetAddress.getByName(args[0]);

        NetworkInterface ni = NetworkInterface.getByInetAddress(local);

        System.out.println((ni == null) ? "本機不存在此IP位址!" : ni);        

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;

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方法得到本機所有的網絡接口。

import java.util.*;

public class MyNetworkInterface3

        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();

        while (nis.hasMoreElements())

            System.out.println(nis.nextElement());

運作結果(部分):

name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC ) index: 4 addresses:

Java網絡程式設計從入門到精通(11):使用NetworkInterface類獲得網絡接口資訊
Java網絡程式設計從入門到精通(11):使用NetworkInterface類獲得網絡接口資訊

    上面的運作結果隻是一種可能的結果,讀者在運作上面的程式時根據本機的硬體和軟體的配置不同,運作結果可能會有所不同。

三、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方法。

public class MyNetworkInterface4

        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

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>