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

          Java網絡編程從入門到精通(2):創建InetAddress對象的四個靜態方法

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

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

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

          一、getLocalHost方法

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

          public static InetAddress getLocalHost() throws UnknownHostException

          這個方法拋出了一個UnknownHostException異常,因此,必須在調用這個方法的程序中捕捉或拋出這個異常。下面的代碼演示了如何使用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);        
              }
          }

          運行結果:

          ComputerName/192.168.18.10

          InetAddress類中覆蓋了Object類的toString方法,實現如下:

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

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

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

          二、getByName方法

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

          public static InetAddress getByName(String host) throws UnknownHostException

          如果host所指的域名對應多個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

          執行如下命令:

          java inet.MyInetAddress2 www.csdn.net

          運行結果:

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

          執行如下命令:

          java inet.MyInetAddress2 ComputerName

          運行結果:

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

          執行如下命令:

          java inet.MyInetAddress2 localhost

          運行結果:

          localhost/127.0.0.1

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

          192.168.18.100   www.mysite.com

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

          執行如下命令:

          java inet.MyInetAddress2 www.mysite.com

          運行結果:

          www.mysite.com/192.168.18.100

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

          三、getAllByName方法

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

             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

          執行如下命令:

          java inet.MyInetAddress3 www.csdn.net

          運行結果:

          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

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


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

          執行如下命令:

          java inet.MyInetAddress3 211.100.26.122

          運行結果:

          /211.100.26.122

          四、getByAddress方法

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

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

          第一個重載形式只需要傳遞byte數組形式的IP地址,getByAddress方法并不驗證這個IP地址是否存在,只是簡單地創建一個InetAddress對象。addr數組的長度必須是4IPv4)或16IPv6),如果是其他長度的byte數組,getByAddress將拋出一個UnknownHostException異常。第二個重載形式多了一個host,這個hostgetByNamegetAllByName方法中的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官方網站", ip);
                    System.out.println(address1);
                    System.out.println(address2);
                }
            }

          上面代碼的運行結果如下:

          /141.146.8.66
          Oracle官方網站
          /141.146.8.66

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

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





          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-03-31 10:35 銀河使者 閱讀(5359) 評論(1)  編輯  收藏 所屬分類: java 原創網絡編程

          評論

          # re: Java網絡編程從入門到精通(2):創建InetAddress對象的四個靜態方法  回復  更多評論   

          試了一下非法的IP地址,如1.1.1.455,本以為會返回信息指出IP非法,
          結果和輸入了不存在域名的反應一樣(幾秒鐘后,出現錯誤信息)。
          2009-05-28 22:00 | mellon
          主站蜘蛛池模板: 天峻县| 丰都县| 托克托县| 峡江县| 东方市| 建德市| 永登县| 南丰县| 天镇县| 盐边县| 桂平市| 温州市| 乌什县| 正定县| 凤凰县| 靖州| 安平县| 汝阳县| 琼海市| 高碑店市| 浮山县| 盐城市| 余干县| 潢川县| 呼图壁县| 康马县| 凤城市| 孟州市| 简阳市| 平罗县| 长宁县| 西昌市| 津市市| 平顶山市| 翁源县| 阳曲县| 金溪县| 台东市| 祁阳县| 固原市| 乌海市|