本文為原創,如需轉載,請注明作者和出處,謝謝!
上一篇:
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
方法定義如下:
下面的代碼
是一個顯示指定網絡接口信息的程序,網絡接口名通過命令行參數傳入。
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
執行如下命令:
運行結果:
/ 192.168.18.10 ;
/ 192.168.18.20 ;
- 測試 2
執行如下命令:
運行結果:
2.getByInetAddress 方法
除了可以使用網絡接口名來得到網絡接口的信息,還可以利用
getByInetAddress
方法來確定一個
IP
地址屬于哪一個網絡接口。由于
getByInetAddress
方法必須使用一個
InetAddress
對象封裝的
IP
地址來作為參數,因此,在使用
getByInetAddress
方法之前,必須先創建一個
InetAddress
對象。但要注意不能使用遠程的
IP
的域名來創建
InetAddress
對象,否則
getByInetAddress
將返回
null
。
getByInetAddress
方法的定義如下:
下面代碼
可以確定一個
IP
地址屬于哪一個網絡接口,這個
IP
地址通過命令行參數傳入。
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
執行如下命令:
運行結果:
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
- 測試 2
執行如下命令:
運行結果:
/ 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
方法的定義如下:
下面代碼
演示了如何使用
getNetworkInterfaces
方法得到本機所有的網絡接口。
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());
}
}
運行結果(部分):
/ 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 方法的定義如下:
2.getDisplayName 方法
這個方法可以得到更容易理解的網絡接口名,也可以將這個網絡接口名稱為網絡接口別名。在一些操作系統中(如
Unix
),
getDisplayName
方法和
getName
方法的返回值相同,但在
Windows
中
getDisplayName
方法一般會返回一個更為友好的名字,如
Realtek RTL8139 Family PCI Fast Ethernet NIC
。
getDisplayName
方法的定義如下:
3.getInetAddresses 方法
NetworkInterface
類可以通過
getInetAddresse
方法以
InetAddress
對象的形式返回和網絡接口綁定的所有
IP
地址。
getInetAddresses
方法的定義如下:
上面的代碼
演示了如果使用上述三個
Getter
方法。
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. 測試
執行如下命令:
運行結果:
DisplayName:RealtekRTL8139FamilyPCIFastEthernetNIC
192.168.18.10
192.168.18.20
下一篇: Java網絡編程從入門到精通(12):使用isReachable方法探測主機是否可以連通
國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!
《銀河系列原創教程》 發布
《Java Web開發速學寶典》 出版,歡迎定購
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
