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

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

系統 2065 0

本文為原創,如需轉載,請注明作者和出處,謝謝!

上一篇: 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 方法定義如下:

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

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

<!--<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 ) ? " 網絡接口不存在! " :ni);
}
}

  • 測試 1

執行如下命令:

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

運行結果:

<!--<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

執行如下命令:

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

運行結果:

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

2.getByInetAddress 方法

除了可以使用網絡接口名來得到網絡接口的信息,還可以利用 getByInetAddress 方法來確定一個 IP 地址屬于哪一個網絡接口。由于 getByInetAddress 方法必須使用一個 InetAddress 對象封裝的 IP 地址來作為參數,因此,在使用 getByInetAddress 方法之前,必須先創建一個 InetAddress 對象。但要注意不能使用遠程的 IP 的域名來創建 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 地址屬于哪一個網絡接口,這個 IP 地址通過命令行參數傳入。

<!--<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

執行如下命令:

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

運行結果:

<!--<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

執行如下命令:

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

運行結果:

<!--<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 地址,因此,運行結果返回的 ppp0 ADSL 網絡接口。

二、 得到本機所有的網絡接口

NetworkInterface 可以通過 getNetworkInterfaces 方法來枚舉本機所有的網絡接口。我們也可以利用 getNetworkInterfaces 得到的網絡接口來枚舉本機的所有 IP 地址。當然,也可以通過 InetAddress 類的 getAllByName 來得到本機的所有 IP 地址。但 getNetworkInterfaces 方法可以按網絡接口將這些 IP 地址進行分組,這對于只想得到某個網絡接口上的所有 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 方法得到本機所有的網絡接口。

<!--<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());
}
}

運行結果(部分):

<!--<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 ;

上面的運行結果只是一種可能的結果,讀者在運行上面的程序 時根據本機的硬件和軟件的配置不同,運行結果可能會有所不同。

三、 NetworkInterface 類的 Getter 方法

NetworkInterface 類提供了三個方法可以分別得到網絡接口名 (getName 方法 ) 、網絡接口別名 (getDisplayName 方法 ) 以及和網絡接口綁定的所有 IP 地址 (getInetAddresses 方法 )

1.getName 方法

這個方法用來得到一個網絡接口的名稱。這個名稱就是使用 getByName 方法創建 NetworkInterface 對象時使用的網絡接口名,如 eth0 ppp0 等。 getName 方法的定義如下:

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

2.getDisplayName 方法

這個方法可以得到更容易理解的網絡接口名,也可以將這個網絡接口名稱為網絡接口別名。在一些操作系統中(如 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 對象的形式返回和網絡接口綁定的所有 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. 測試

執行如下命令:

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

運行結果:

<!--<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網絡編程從入門到精通(12):使用isReachable方法探測主機是否可以連通

國內最棒的Google Android技術社區(eoeandroid),歡迎訪問!

《銀河系列原創教程》 發布

《Java Web開發速學寶典》 出版,歡迎定購

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 小金县| 闽侯县| 剑河县| 白玉县| 台东县| 张家口市| 祁门县| 青铜峡市| 收藏| 图们市| 南平市| 读书| 丰宁| 南昌县| 桃园县| 宜春市| 安西县| 新蔡县| 娄烦县| 肥西县| 瓮安县| 乌什县| 舞钢市| 尉氏县| 潞城市| 上犹县| 东安县| 嘉义县| 思南县| 木兰县| 宣城市| 广州市| 江山市| 唐河县| 松滋市| 兴山县| 马边| 东方市| 日照市| 怀宁县| 庄河市|