<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 銀河使者 閱讀(10278) 評論(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
    主站蜘蛛池模板: 日本免费一本天堂在线| 久久久亚洲精华液精华液精华液 | 亚洲精品第一国产综合精品99 | 亚洲一卡2卡3卡4卡5卡6卡| 久久精品国产这里是免费| 亚洲日韩乱码中文无码蜜桃臀网站| 曰批全过程免费视频观看免费软件| 免费人妻av无码专区| 成人午夜影视全部免费看| 亚洲国产成人精品女人久久久 | 精品亚洲成在人线AV无码| 日韩一区二区a片免费观看| 亚洲第一区二区快射影院| 午夜无遮挡羞羞漫画免费| 亚洲av片在线观看| 亚洲国产成人精品女人久久久| 一级特黄录像免费播放中文版| 在线观看亚洲精品国产| 亚洲成人免费在线| 亚洲国产成人精品电影| 成人人观看的免费毛片| 国产亚洲人成在线影院| 亚洲综合精品香蕉久久网| 91香焦国产线观看看免费| 亚洲欧洲日韩极速播放| www国产亚洲精品久久久日本| a级精品九九九大片免费看| 亚洲精品91在线| 国产一级高清免费观看| 91成人免费观看在线观看| 亚洲视频在线免费播放| 看全色黄大色大片免费久久| 高清免费久久午夜精品| 91大神亚洲影视在线| 午夜电影免费观看| 91福利免费网站在线观看| 亚洲国产av高清无码| 亚洲国产精品一区二区第一页免| 一区二区三区四区免费视频| 亚洲欧美aⅴ在线资源| 亚洲级αV无码毛片久久精品|