從JDK1.4開始,Java提供了一個NetworkInterface類.這個類可以得到本機所有的物理網路介面和虛擬機等軟體利用本機的物理網路介面創建的邏輯網路介面的信息.
相關技術專題:Java網路編程-基礎到進階教程
一、創建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 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.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; 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 { { 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.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 |
[火星人 ] Java網路編程從入門到精通(11):使用NetworkInterface類獲得網路介面信息已經有1366次圍觀