日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Java網(wǎng)絡編程從入門到精通(11):使用NetworkI

系統(tǒng) 2166 0

本文為原創(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 方法定義如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public static NetworkInterfacegetByName(Stringname) throws SocketException

下面的代碼 是一個顯示指定網(wǎng)絡接口信息的程序,網(wǎng)絡接口名通過命令行參數(shù)傳入。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> package mynet;

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í)行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> javamynet.MyNetworkInterface1eth0

運行結(jié)果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> name:eth0(RealtekRTL8139FamilyPCIFastEthernetNIC)index: 4 addresses:
/
192.168.18.10 ;
/ 192.168.18.20 ;
  • 測試 2

執(zhí)行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> javamynet.MyNetworkInterface1abcd

運行結(jié)果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 網(wǎng)絡接口不存在!

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 方法的定義如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public static NetworkInterfacegetByInetAddress(InetAddressaddr) throws SocketException

下面代碼 可以確定一個 IP 地址屬于哪一個網(wǎng)絡接口,這個 IP 地址通過命令行參數(shù)傳入。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> package mynet;

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í)行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> javamynet.MyNetworkInterface2 127.0 . 0.1

運行結(jié)果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> name:lo(MSTCPLoopbackinterface)index: 1 addresses:
/
127.0.0.1 ;
/ 0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 ;
  • 測試 2

執(zhí)行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> javamynet.MyNetworkInterface2 218.61.151.22

運行結(jié)果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> name:ppp0(WAN(PPP/SLIP)Interface)index: 0 addresses:
/
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 方法的定義如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public static Enumeration < NetworkInterface > getNetworkInterfaces() throws SocketException

下面代碼 演示了如何使用 getNetworkInterfaces 方法得到本機所有的網(wǎng)絡接口。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 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());
}
}

運行結(jié)果(部分):

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> name:lo(MSTCPLoopbackinterface)index: 1 addresses:
/
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 方法的定義如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public StringgetName()

2.getDisplayName 方法

這個方法可以得到更容易理解的網(wǎng)絡接口名,也可以將這個網(wǎng)絡接口名稱為網(wǎng)絡接口別名。在一些操作系統(tǒng)中(如 Unix ), getDisplayName 方法和 getName 方法的返回值相同,但在 Windows getDisplayName 方法一般會返回一個更為友好的名字,如 Realtek RTL8139 Family PCI Fast Ethernet NIC getDisplayName 方法的定義如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public StringgetDisplayName()

3.getInetAddresses 方法

NetworkInterface 類可以通過 getInetAddresse 方法以 InetAddress 對象的形式返回和網(wǎng)絡接口綁定的所有 IP 地址。 getInetAddresses 方法的定義如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> public Enumeration < InetAddress > getInetAddresses()

上面的代碼 演示了如果使用上述三個 Getter 方法。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> package mynet;

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í)行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> javamynet.MyNetworkInterface4eth0

運行結(jié)果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> Name:eth0
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ā)速學寶典》 出版,歡迎定購

Java網(wǎng)絡編程從入門到精通(11):使用NetworkInterface類獲得網(wǎng)絡接口信息


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 同德县| 石屏县| 乐都县| 信阳市| 南丰县| 耒阳市| 罗山县| 沈阳市| 分宜县| 浙江省| 平度市| 邹城市| 龙州县| 荣昌县| 静宁县| 汉川市| 个旧市| 郯城县| 抚宁县| 乐都县| 专栏| 唐河县| 平顺县| 鹤峰县| 英吉沙县| 自贡市| 昭平县| 棋牌| 朝阳县| 深圳市| 古浪县| 马公市| 甘南县| 宁都县| 迁安市| 莎车县| 稻城县| 融水| 桓台县| 娱乐| 若尔盖县|