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


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

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