隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

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

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

          上一篇:Java網絡編程從入門到精通(10):Inet4Address類和Inet6Address類

              JDK1.4開始,Java提供了一個NetworkInterface類。這個類可以得到本機所有的物理網絡接口和虛擬機等軟件利用本機的物理網絡接口創建的邏輯網絡接口的信息。

          一、創建NetworkInterface對象的兩個靜態方法

          NetworkInerface類和InetAddress一樣,也沒有public的構造方法。因此,必須通過它的兩個靜態方法來創建NetworkInterface對象。可以使用兩種方法來創建NetworkInterface對象:網絡接口名(getByName方法)和IP地址(getByInetAddress方法)

          1. getByName方法

          這個方法可以通過網絡接口名來創建NetworkInterface對象。這個網絡接口名并不是計算機名,而是用于標識物理或邏輯網絡接口的名字,一般是由操作系統設置的。網絡接口名在大多數操作系統上(包括WindowsLinuxUnix)是以eth開頭,后面是網絡接口的索引號,從0開始。如本機安了三塊網卡,那么網絡接口名就依次是eth0eth1eth2NetworkInterface對象的toString方法可以返回網絡接口的名稱、顯示名和這個網絡接口上綁字的所有IP地址等信息。當網絡接口名不存在時,getByName返回nullgetByName方法定義如下:

              public static NetworkInterface getByName(String name) throws SocketException

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

          package mynet;

          import java.net.*;

          public class MyNetworkInterface1
          {
              
          public static void main(String[] args) throws Exception
              {
                  
          if (args.length == 0)
                      
          return;
                  NetworkInterface ni 
          = NetworkInterface.getByName(args[0]);
                  System.out.println((ni 
          == null? "網絡接口不存在!" : ni);
              }
          }

          • 測試1

          執行如下命令:

          java mynet.MyNetworkInterface1 eth0

          運行結果:

          name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC) index: 4 addresses:
          /
          192.168.18.10;
          /192.168.18.20;
          • 測試2

          執行如下命令:

          java mynet.MyNetworkInterface1 abcd

          運行結果:

          網絡接口不存在!

          2. getByInetAddress方法

              除了可以使用網絡接口名來得到網絡接口的信息,還可以利用getByInetAddress方法來確定一個IP地址屬于哪一個網絡接口。由于getByInetAddress方法必須使用一個InetAddress對象封裝的IP地址來作為參數,因此,在使用getByInetAddress方法之前,必須先創建一個InetAddress對象。但要注意不能使用遠程的IP的域名來創建InetAddress對象,否則getByInetAddress將返回nullgetByInetAddress方法的定義如下:

          public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException

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

          package mynet;

          import java.net.*;

          public class MyNetworkInterface2
          {

              
          public static void main(String[] args) throws Exception
              {
                  
          if(args.length == 0return;
                  InetAddress local 
          = InetAddress.getByName(args[0]);
                  NetworkInterface ni 
          = NetworkInterface.getByInetAddress(local);
                  System.out.println((ni 
          == null? "本機不存在此IP地址!" : ni);        
              }
          }

          • 測試1

          執行如下命令:

          java mynet.MyNetworkInterface2 127.0.0.1

          運行結果:

          name:lo (MS TCP Loopback interface) index: 1 addresses:
          /
          127.0.0.1;
          /0:0:0:0:0:0:0:1;
          • 測試2

          執行如下命令:

          java mynet.MyNetworkInterface2 218.61.151.22

          運行結果:

          name:ppp0 (WAN (PPP/SLIP) Interface) index: 0 addresses:
          /
          218.61.151.22;

              測試2使用的IP地址218.61.151.22ADSL連接臨時分配給本機的IP地址,因此,運行結果返回的ppp0ADSL網絡接口。

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

              NetworkInterface可以通過getNetworkInterfaces方法來枚舉本機所有的網絡接口。我們也可以利用getNetworkInterfaces得到的網絡接口來枚舉本機的所有IP地址。當然,也可以通過InetAddress類的getAllByName來得到本機的所有IP地址。但getNetworkInterfaces方法可以按網絡接口將這些IP地址進行分組,這對于只想得到某個網絡接口上的所有IP地址是非常有用的。getNetworkInterfaces方法的定義如下:

          public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException

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

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

          運行結果(部分):

          name:lo (MS TCP Loopback interface) index: 1 addresses:
          /
          127.0.0.1;
          /0:0:0:0:0:0:0:1;
          name:eth0 (Realtek RTL8139 Family PCI Fast Ethernet NIC ) 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對象時使用的網絡接口名,如eth0ppp0等。getName方法的定義如下:

          public String getName()

          2. getDisplayName方法

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

          public String getDisplayName()

          3. getInetAddresses方法

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

          public Enumeration<InetAddress> getInetAddresses()

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

          package mynet;

          import java.net.*;
          import java.util.*;

          public class MyNetworkInterface4
          {
              
          public static void main(String[] args) throws Exception
              {
                  
          if (args.length == 0)
                      
          return;
                  NetworkInterface ni 
          = 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. 測試

          執行如下命令:

          java mynet.MyNetworkInterface4 eth0

          運行結果:

          Name: eth0
          DisplayName: Realtek RTL8139 Family PCI Fast Ethernet NIC
          192.168.18.10
          192.168.18.20

          下一篇:Java網絡編程從入門到精通(12):使用isReachable方法探測主機是否可以連通



          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-05-08 08:53 銀河使者 閱讀(10282) 評論(9)  編輯  收藏 所屬分類: java 原創網絡編程

          評論

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          你這個系列是對JDK文檔的詳細說明。網絡編程難點不在API的使用上,這個看看文檔,看看tutorial就知道了。網絡編程的難點在于理解各種網絡IO模型,熟悉TCP/IP協議,熟悉并發模型,知道網絡編程的性能關鍵要素,并對各種開源網絡框架的優劣勢有個比較清晰的認識等等。API使用反而是最不重要的。
          2009-05-08 11:28 | dennis

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          我這個系列文章才剛開始,估計得有上百篇文章,還沒進入大規模編程的階段。另外,你說的熟悉什么 TCP/IP協議、并發模型這些都有些抽象。實際上,不管是網絡編程,還是多核編程,關鍵看你做出來什么。至于熟悉這個或那個,只是知識量而已。只有做出有影響力的產品才是真的。還有并不一定技術高深就是好的,關鍵看能提供多少用戶價值。
          2009-05-08 11:46 | 銀河使者

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          期待LZ這個系列文章的早日完成!
          2009-05-08 12:21 | 學者

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          @銀河使者
          我是在說網絡編程,你在跟我說做產品,呵呵,我們說的不是一個東西。我是認為網絡編程的學習著重點應該在我說的這幾個方面,網絡編程不僅僅是熟悉JAVA提供的api,難道換了種語言你就不會網絡編程了?我強調的是學習重點。
          2009-05-08 15:40 | dennis

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          @dennis
          實際上,學習并沒有絕對的重點,不管是理論(如tcp/ip、網絡層等)或是api都需要會,不會哪個都寫不出優秀的程序。但個人認為在學習理論之前,應該先了解一下api,也就是說,在寫出優秀的程序之前,先要能寫出程序。如果連helloword都寫不出來,又怎么談高質量的程序呢?而本系列文章就是先讓讀者能寫出程序,至于寫出優秀的程序,那并不是本系列文章的目的。
          還有就是,學習網絡編程的重點應該放在實踐上,不管是學的tcp/ip,還是學的api、socket這些東西,都需要將它們轉換成代碼才可以。否則學了只能應付考試。因此,無論是api,還是網絡理論,都應該是重點。另外,api可不是很簡單的。并不是有一堆方法,調用就完了。有很多參數和調用方法是和理論聯系非常緊密的。因此,最好理論和api一起學,否則用什么實踐呢?直接訪問網卡驅動?
          2009-05-08 16:26 | 銀河使者

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          學習了,正好準備學習網絡編程,閣下的這個系列對我很有用,謝謝啦,期待大作的完成,順便問下,能不能交換下鏈接

          您的鏈接我已經幫您做好了,我的鏈接是:
          名稱:John Winning's Blog
          網址:http://www.godupgod.com
          2009-05-30 22:59 | John Winning

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息[未登錄]  回復  更多評論   

          好東東!!!
          多謝分享!!!
          2009-06-04 10:40 | Java愛好者

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          hao
          2013-04-21 14:34 | ll

          # re: Java網絡編程從入門到精通(11):使用NetworkInterface類獲得網絡接口信息  回復  更多評論   

          絕對的好東西,我是greenhand。頂樓主。有個小糾結:沒找到目錄--只有上一篇,下一篇。有點不方便。想都看
          2013-04-21 14:36 | cxw
          主站蜘蛛池模板: 通山县| 江陵县| 浦江县| 南康市| 乐至县| 师宗县| 河津市| 日土县| 宝坻区| 沅陵县| 长武县| 无极县| 南通市| 吉安市| 信宜市| 伊吾县| 庄浪县| 三原县| 旺苍县| 新郑市| 会昌县| 客服| 房山区| 湄潭县| 阜阳市| 永宁县| 临颍县| 建宁县| 固原市| 齐齐哈尔市| 平罗县| 莱州市| 嘉黎县| 苍山县| 东乡族自治县| 阳江市| 西乡县| 基隆市| 买车| 濮阳市| 高州市|