本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!
上一篇:
Java網(wǎng)絡編程從入門到精通(10):Inet4Address類和Inet6Address類
從
JDK1.4
開始,
Java
提供了一個
NetworkInterface
類。這個類可以得到本機所有的物理網(wǎng)絡接口和虛擬機等軟件利用本機的物理網(wǎng)絡接口創(chuàng)建的邏輯網(wǎng)絡接口的信息。
一、 創(chuàng)建 NetworkInterface 對象的兩個靜態(tài)方法
NetworkInerface 類和 InetAddress 一樣,也沒有 public 的構(gòu)造方法。因此,必須通過它的兩個靜態(tài)方法來創(chuàng)建 NetworkInterface 對象。可以使用兩種方法來創(chuàng)建 NetworkInterface 對象:網(wǎng)絡接口名( getByName 方法)和 IP 地址 (getByInetAddress 方法 ) 。
1.getByName 方法
這個方法可以通過網(wǎng)絡接口名來創(chuàng)建
NetworkInterface
對象。這個網(wǎng)絡接口名并不是計算機名,而是用于標識物理或邏輯網(wǎng)絡接口的名字,一般是由操作系統(tǒng)設置的。網(wǎng)絡接口名在大多數(shù)操作系統(tǒng)上(包括
Windows
、
Linux
和
Unix
)是以
eth
開頭,后面是網(wǎng)絡接口的索引號,從
0
開始。如本機安了三塊網(wǎng)卡,那么網(wǎng)絡接口名就依次是
eth0
、
eth1
和
eth2
。
NetworkInterface
對象的
toString
方法可以返回網(wǎng)絡接口的名稱、顯示名和這個網(wǎng)絡接口上綁字的所有
IP
地址等信息。當網(wǎng)絡接口名不存在時,
getByName
返回
null
。
getByName
方法定義如下:
下面的代碼
是一個顯示指定網(wǎng)絡接口信息的程序,網(wǎng)絡接口名通過命令行參數(shù)傳入。
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 ) ? " 網(wǎng)絡接口不存在! " :ni);
}
}
- 測試 1
執(zhí)行如下命令:
運行結(jié)果:
/ 192.168.18.10 ;
/ 192.168.18.20 ;
- 測試 2
執(zhí)行如下命令:
運行結(jié)果:
2.getByInetAddress 方法
除了可以使用網(wǎng)絡接口名來得到網(wǎng)絡接口的信息,還可以利用
getByInetAddress
方法來確定一個
IP
地址屬于哪一個網(wǎng)絡接口。由于
getByInetAddress
方法必須使用一個
InetAddress
對象封裝的
IP
地址來作為參數(shù),因此,在使用
getByInetAddress
方法之前,必須先創(chuàng)建一個
InetAddress
對象。但要注意不能使用遠程的
IP
的域名來創(chuàng)建
InetAddress
對象,否則
getByInetAddress
將返回
null
。
getByInetAddress
方法的定義如下:
下面代碼
可以確定一個
IP
地址屬于哪一個網(wǎng)絡接口,這個
IP
地址通過命令行參數(shù)傳入。
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
執(zhí)行如下命令:
運行結(jié)果:
/ 127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
- 測試 2
執(zhí)行如下命令:
運行結(jié)果:
/ 218.61.151.22 ;
測試 2 使用的 IP 地址 218.61.151.22 是 ADSL 連接臨時分配給本機的 IP 地址,因此,運行結(jié)果返回的 ppp0 是 ADSL 網(wǎng)絡接口。
二、 得到本機所有的網(wǎng)絡接口
NetworkInterface
可以通過
getNetworkInterfaces
方法來枚舉本機所有的網(wǎng)絡接口。我們也可以利用
getNetworkInterfaces
得到的網(wǎng)絡接口來枚舉本機的所有
IP
地址。當然,也可以通過
InetAddress
類的
getAllByName
來得到本機的所有
IP
地址。但
getNetworkInterfaces
方法可以按網(wǎng)絡接口將這些
IP
地址進行分組,這對于只想得到某個網(wǎng)絡接口上的所有
IP
地址是非常有用的。
getNetworkInterfaces
方法的定義如下:
下面代碼
演示了如何使用
getNetworkInterfaces
方法得到本機所有的網(wǎng)絡接口。
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());
}
}
運行結(jié)果(部分):
/ 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 ;


上面的運行結(jié)果只是一種可能的結(jié)果,讀者在運行上面的程序
時根據(jù)本機的硬件和軟件的配置不同,運行結(jié)果可能會有所不同。
三、 NetworkInterface 類的 Getter 方法
NetworkInterface 類提供了三個方法可以分別得到網(wǎng)絡接口名 (getName 方法 ) 、網(wǎng)絡接口別名 (getDisplayName 方法 ) 以及和網(wǎng)絡接口綁定的所有 IP 地址 (getInetAddresses 方法 ) 。
1.getName 方法
這個方法用來得到一個網(wǎng)絡接口的名稱。這個名稱就是使用 getByName 方法創(chuàng)建 NetworkInterface 對象時使用的網(wǎng)絡接口名,如 eth0 、 ppp0 等。 getName 方法的定義如下:
2.getDisplayName 方法
這個方法可以得到更容易理解的網(wǎng)絡接口名,也可以將這個網(wǎng)絡接口名稱為網(wǎng)絡接口別名。在一些操作系統(tǒng)中(如
Unix
),
getDisplayName
方法和
getName
方法的返回值相同,但在
Windows
中
getDisplayName
方法一般會返回一個更為友好的名字,如
Realtek RTL8139 Family PCI Fast Ethernet NIC
。
getDisplayName
方法的定義如下:
3.getInetAddresses 方法
NetworkInterface
類可以通過
getInetAddresse
方法以
InetAddress
對象的形式返回和網(wǎng)絡接口綁定的所有
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. 測試
執(zhí)行如下命令:
運行結(jié)果:
DisplayName:RealtekRTL8139FamilyPCIFastEthernetNIC
192.168.18.10
192.168.18.20
下一篇: Java網(wǎng)絡編程從入門到精通(12):使用isReachable方法探測主機是否可以連通
國內(nèi)最棒的Google Android技術(shù)社區(qū)(eoeandroid),歡迎訪問!
《銀河系列原創(chuàng)教程》 發(fā)布
《Java Web開發(fā)速學寶典》 出版,歡迎定購
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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