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

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

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

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

    Java網(wǎng)絡(luò)編程從入門到精通(2):創(chuàng)建InetAddress對象的四個靜態(tài)方法

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

    上一篇:Java網(wǎng)絡(luò)編程從入門到精通(1):Internet地址概述

        InetAddress類是Java中用于描述IP地址的類。它在java.net包中。在Java中分別用Inet4AddressInet6Address類來描述IPv4IPv6的地址。這兩個類都是InetAddress的子類。由于InetAddress沒有public的構(gòu)造方法,因此,要想創(chuàng)建InetAddress對象,必須得依靠它的四個靜態(tài)方法。InetAddress可以通過getLocalHost方法得到本機的InetAddress對象,也可以通過getByName、getAllByNamegetByAddress得到遠程主機的InetAddress對象。

    一、getLocalHost方法

    使用getLocalHost可以得到描述本機IPInetAddress對象。這個方法的定義如下:

    public static InetAddress getLocalHost() throws UnknownHostException

    這個方法拋出了一個UnknownHostException異常,因此,必須在調(diào)用這個方法的程序中捕捉或拋出這個異常。下面的代碼演示了如何使用getLocalHost來得到本機的IP和計算機名。

    package inet;

    import java.net.*;

    public class MyInetAddress1
    {
        
    public static void main(String[] args) throws Exception
        {
            InetAddress localAddress 
    = InetAddress.getLocalHost();
            System.out.println(localAddress);        
        }
    }

    運行結(jié)果:

    ComputerName/192.168.18.10

    InetAddress類中覆蓋了Object類的toString方法,實現(xiàn)如下:

    public String toString() 
    {
         return ((hostName != null? hostName : ""+ "/" + getHostAddress();
    }

    從上面的代碼可以看出,InetAddress方法中的toString方法返回了用“/“隔開的主機名和IP地址。因此,在上面的代碼直接通過localAddress對象來輸出本機計算機名和IP地址(將對象參數(shù)傳入println方法后,println方法會調(diào)用對象參數(shù)的toString方法來輸出結(jié)果)。

    當本機綁定了多個IP時,getLocalHost只返回第一個IP。如果想返回本機全部的IP,可以使用getAllByName方法。

    二、getByName方法

    這個方法是InetAddress類最常用的方法。它可以通過指定域名從DNS中得到相應(yīng)的IP地址。getByName一個String類型參數(shù),可以通過這個參數(shù)指定遠程主機的域名,它的定義如下:

    public static InetAddress getByName(String host) throws UnknownHostException

    如果host所指的域名對應(yīng)多個IPgetByName返回第一個IP。如果本機名已知,可以使用getByName方法來代替getLocalHost。當host的值是localhost時,返回的IP一般是127.0.0.1。如果host是不存在的域名,getByName將拋出UnknownHostException異常,如果hostIP地址,無論這個IP地址是否存在,getByName方法都會返回這個IP地址(因此getByName并不驗證IP地址的正確性)。下面代碼演示了如何使用getByName方法:

      package inet;
      
      
    import java.net.*;
      
      
    public class MyInetAddress2
      {
          
    public static void main(String[] args) throws Exception
          {
              
    if (args.length == 0)
                  
    return;
              String host 
    = args[0];
              InetAddress address 
    = InetAddress.getByName(host);
              System.out.println(address);
          }
      }

    •  測試1:遠程主機www.csdn.net

    執(zhí)行如下命令:

    java inet.MyInetAddress2 www.csdn.net

    運行結(jié)果:

    www.csdn.net/211.100.26.124
    • 測試2:本機名ComputerName

    執(zhí)行如下命令:

    java inet.MyInetAddress2 ComputerName

    運行結(jié)果:

    ComputerName/192.168.18.10
    • 測試3:代表本機的localhost

    執(zhí)行如下命令:

    java inet.MyInetAddress2 localhost

    運行結(jié)果:

    localhost/127.0.0.1

    對于本機來說,除了可以使用本機名或localhost外,還可以在hosts文件中對本機做“IP/域名映射(在Windows操作系統(tǒng)下)。這個文件在C:\WINDOWS\system32\drivers\etc中。打開這兩個文件中,在最后加一行如下所示的字符串:

    192.168.18.100   www.mysite.com

    • 測試4:本機域名www.mysite.com

    執(zhí)行如下命令:

    java inet.MyInetAddress2 www.mysite.com

    運行結(jié)果:

    www.mysite.com/192.168.18.100

    getByName方法除了可以使用域名作為參數(shù)外,也可以直接使用IP地址作為參數(shù)。如果使用IP地址作為參數(shù),輸出InetAddress對象時域名為空(除非調(diào)用getHostName方法后,再輸出InetAddress對象。getHostName方法將在下面的內(nèi)容介紹)。讀者可以使用129.42.58.212作為MyInetAddress2的命令行參數(shù)(這是www.ibm.comIP),看看會得到什么結(jié)果。

    三、getAllByName方法

    使用getAllByName方法可以從DNS上得到域名對應(yīng)的所有的IP。這個方法返回一個InetAddress類型的數(shù)組。這個方法的定義如下:

       public static InetAddress[] getAllByName(String host) throws UnknownHostException

       getByName方法一樣,當host不存在時,getAllByName也會拋出UnknowHostException異常,getAllByName也不會驗證IP地址是否存在。下面的代碼演示了getAllByName的用法:

      package inet;
      
      
    import java.net.*;
      
      
    public class MyInetAddress3
      {
          
    public static void main(String[] args) throws Exception
          {
              
    if (args.length == 0)
                  
    return;
              String host 
    = args[0];
              InetAddress addresses[] 
    = InetAddress.getAllByName(host);
              
    for (InetAddress address : addresses)
                  System.out.println(address);
          }
      }

    • 測試1:遠程主機www.csdn.net

    執(zhí)行如下命令:

    java inet.MyInetAddress3 www.csdn.net

    運行結(jié)果:

    www.csdn.net/211.100.26.124
    www.csdn.net
    /211.100.26.121
    www.csdn.net
    /211.100.26.122
    www.csdn.net
    /211.100.26.123

    將上面的運行結(jié)果和例程3-2的測試1的運行結(jié)果進行比較,可以得出一個結(jié)論,getByName方法返回的IP地址就是getAllByName方法返回的第一個IP地址。事實上,getByName的確是這樣實現(xiàn)的,getByName的實現(xiàn)代碼如下:


    public static InetAddress getByName(String host) throws UnknownHostException
    {
         return InetAddress.getAllByName(host)[0];
    }
    •  測試2:使用www.csdn.net的一個IP 

    執(zhí)行如下命令:

    java inet.MyInetAddress3 211.100.26.122

    運行結(jié)果:

    /211.100.26.122

    四、getByAddress方法

    這個方法必須通過IP地址來創(chuàng)建InetAddress對象,而且IP地址必須是byte數(shù)組形式。getByAddress方法有兩個重載形式,定義如下:

    public static InetAddress getByAddress(byte[] addr) throws UnknownHostException
    public static InetAddress getByAddress(String host, byte[] addr) throws UnknownHostException

    第一個重載形式只需要傳遞byte數(shù)組形式的IP地址,getByAddress方法并不驗證這個IP地址是否存在,只是簡單地創(chuàng)建一個InetAddress對象。addr數(shù)組的長度必須是4IPv4)或16IPv6),如果是其他長度的byte數(shù)組,getByAddress將拋出一個UnknownHostException異常。第二個重載形式多了一個host,這個hostgetByName、getAllByName方法中的host的意義不同,getByAddress方法并不使用hostDNS上查找IP地址,這個host只是一個用于表示addr的別名。下面的代碼演示了getByAddress的兩個重載形式的用法:

      package inet;
      
      
    import java.net.*;
      
      
    public class MyInetAddress4
      {
          
    public static void main(String[] args) throws Exception
          {
              
    byte ip[] = new byte[] { (byte141, (byte1468 , 66};
              InetAddress address1 
    = InetAddress.getByAddress(ip);
              InetAddress address2 
    = InetAddress.getByAddress("Oracle官方網(wǎng)站", ip);
              System.out.println(address1);
              System.out.println(address2);
          }
      }

    上面代碼的運行結(jié)果如下:

    /141.146.8.66
    Oracle官方網(wǎng)站
    /141.146.8.66

        從上面的運行結(jié)果可以看出,getByAddress只是簡單地將host參數(shù)作為域名放到“/”前面,因此,host可以是任何字符串。

    下一篇:
    Java網(wǎng)絡(luò)編程從入門到精通(3):為什么不能直接通過IP訪問網(wǎng)站





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

    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-03-31 10:35 銀河使者 閱讀(5356) 評論(1)  編輯  收藏 所屬分類: java 、 原創(chuàng)網(wǎng)絡(luò)編程

    評論

    # re: Java網(wǎng)絡(luò)編程從入門到精通(2):創(chuàng)建InetAddress對象的四個靜態(tài)方法  回復(fù)  更多評論   

    試了一下非法的IP地址,如1.1.1.455,本以為會返回信息指出IP非法,
    結(jié)果和輸入了不存在域名的反應(yīng)一樣(幾秒鐘后,出現(xiàn)錯誤信息)。
    2009-05-28 22:00 | mellon
    主站蜘蛛池模板: 7777久久亚洲中文字幕蜜桃 | 西西人体大胆免费视频| 亚洲熟妇无码八AV在线播放| 色窝窝免费一区二区三区| 国产伦精品一区二区免费| 亚洲七久久之综合七久久| 亚洲国产一区二区a毛片| 亚洲美女在线国产| 成年女人永久免费观看片| 国产亚洲精品看片在线观看| 野花高清在线观看免费完整版中文| 任你躁在线精品免费| 免费看黄网站在线看| 亚洲色大成网站www永久网站| 亚洲高清免费在线观看| 亚洲AV无码成人专区片在线观看| 亚洲日本韩国在线| 国产99视频免费精品是看6| 国产久爱免费精品视频| 免费国产黄网站在线观看动图| 亚洲精品无码日韩国产不卡av| 亚洲国产精品综合久久2007| 欧洲美熟女乱又伦免费视频| 一道本在线免费视频| 国产亚洲一卡2卡3卡4卡新区 | 久9热免费精品视频在线观看| 国产免费伦精品一区二区三区| 日韩免费高清一级毛片| 最新亚洲人成无码网www电影| 亚洲AV日韩综合一区| 亚洲啪AV永久无码精品放毛片| 亚洲一日韩欧美中文字幕在线| 亚洲一卡2卡3卡4卡乱码 在线 | 亚洲日本va一区二区三区| 亚洲一级毛片免费看| 久久亚洲欧洲国产综合| 亚洲另类少妇17p| 亚洲欧洲精品成人久久曰影片| 亚洲国产精品13p| 爱情岛论坛网亚洲品质自拍| 国产国拍亚洲精品福利|