從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());
}
}
測試
執行如下命令:
java mynet.MyNetworkInterface4 eth0
運行結果:
Name: eth0
DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC
192.168.18.10
192.168.18.20