Android開発のInetAddress基礎入門概要とソースの例


最近はsoketプログラミングを勉強していますが、IPアドレスなどを取得する必要があるので、どうやってホスト名のIPアドレスを取得するかを見に行きました。
実は一つのクラスのInetAddressを使う必要があります。彼はjava.netのカバンの下にいます。
InetAddresクラスのオブジェクトはIPアドレスとドメイン名に使用され、このクラスは以下の方法を提供する。
getByName(String s):InetAddresクラスのオブジェクトを取得し、オブジェクトの中にホストのIPアドレスとドメイン名が含まれています。オブジェクトは以下のフォーマットでそれが含まれている情報を表します。
String get HostName():InetAddressオブジェクトのドメイン名を取得する;
String get Hoddres():InetAddresオブジェクトのIPアドレスを取得する。
get Local Host():InetAddresオブジェクトを取得し、そのオブジェクトはローカルマシンのドメイン名とIPアドレスを含む。

private void test() {
    try {
      InetAddress locAdd = InetAddress.getLocalHost(); //    InetAddress  
      /* get www.baidu.com's ip */
      InetAddress remAdd = InetAddress.getByName("www.baidu.com"); //    InetAddress  
      System.out.println("  IP  :" + locAdd.getHostAddress()); //    IP  
      System.out.println("  IP  :" + remAdd.getHostAddress()); //    IP  
      System.out.println("      :" + locAdd.isReachable(10000)); //10000     ,10s
      /*
          :
          IP  :192.168.1.109
          IP  :115.239.210.26
              :true
      */
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
多くの場合、あるドメイン名に対応するホストIPは複数あるかもしれません。私達も一つ一つ取り戻すことができます。以下のとおりです

private void test2() {
    try {
      /*        IP  ,    ,               */
      InetAddress[] addrs = InetAddress.getAllByName("www.baidu.com");
      if (addrs != null && addrs.length > 0) {
        for (InetAddress addr : addrs) {
          System.out.println("--->" + addr.getHostAddress());
        }
      }
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }
  }
IPアドレスは、IPが使用する32ビット(IPv 4)または128ビット(IPv 6)ビットの符号なし数字であり、トランスポート層プロトコルTCP、UDPのベースである。InetAddresはJavaのIPアドレスのパッケージであり、java.netでは、ServerSocket、Socket、DatagramSocketなど、InetAddresに多くの種類が使われています。
InetAddresの例示的なオブジェクトは、デジタル的に保存されたIPアドレスを含み、ホスト名(ホスト名来を使用してInetAddresのインスタンスを取得する場合、または数字を使用して構成され、逆ホスト名解析機能を有効にする場合)も含むことができる。InetAddresクラスは、ホスト名をIPアドレスに解析する方法を提供する。
InetAddresがドメイン名を解析するのは、ドメイン名システム(Domain Name System、DNS)およびネットワーク情報サービス(Network Information Service、NIS)などのローカルマシン構成またはネットワーク命名サービスを使用して実現される。
DNSの場合、ローカルはDNSサーバにクエリの要求を送信し、サーバは一連の動作に従って、対応するIPアドレスを返し、効率を高めるために、通常、ローカルはいくつかのホスト名とIPアドレスのマッピングをキャッシュし、このように同じアドレスにアクセスする必要があります。DNS要求を繰り返し送信する必要はありません。
java.net.InetAddres類においても同様にこの戦略を採用した。デフォルトでは、一定時間のマッピングがキャッシュされますが、ホスト名の解析が失敗した結果、非常に短い時間(10秒)がキャッシュされ、パフォーマンスが向上します。
InetAddress類
このタイプはipアドレスを表しています。下には2つのサブクラスがあります。それぞれInet 4 AddresとInet 6 Addressです。彼らはそれぞれIPV 4アドレスとIPV 6アドレスを表しています。
このクラスにはコンストラクタがないので、InetAddresの例はその2つの静的方法によって取得できます。
>getByName(String host)ホスト名から対応するInetAddresオブジェクトを取得する。
IPアドレスを使ってInetAddresオブジェクトを作成する場合は、DNSサーバにアクセスする必要はありません。したがって、DNSサーバを通じてドメイン名を検索する作業は、get HostName方法によって行われる。
IPアドレスが存在しない場合、またはDNSサーバがIPアドレスとドメイン名のマッピングを許可しない場合、このIPアドレスに戻ります。
InetAddres address=InetAddress.getByName(「141.146.86」)
System.out.println(address.get HostName)//DNSサーバにアクセスしてドメイン名を取得する必要があります。
InetAddres address=InetAddress.getByName(「1.2.3.4」)IPアドレスが存在しません
System.out.println(address.get HostName)//直接IPアドレスに戻ります
ドメイン名をgetByNameとgetAllByNameメソッドのパラメータとして取得したInetAddresオブジェクトは、このドメイン名を取得し、getHostNameを呼び出すと、DNSサーバにアクセスする必要はなく、直接にこのドメイン名を返す。
InetAddres address=InetAddress.getByName(www.jb 51.net);
System.out.println(address.get HostName)//DNSサーバにアクセスする必要がないとドメイン名が得られます。

try {
	InetAddress address = InetAddress.getByName("www.jb51.net");
	System.out.println(address);//www.jb51.net/119.75.218.70
} catch (UnknownHostException e) {
	e.printStackTrace();
}
>getByAddres(byte[]addr)は、ソースipアドレスからInetAddresオブジェクトを取得する。

InetAddress address;
try {
	address= InetAddress.getByAddress(new byte[]{119,75,218,70});
	System.out.println(address);//     :/119.75.218.70    str   
	address = InetAddress.getByAddress("www.jb51.net", ipBuf);
	System.out.println(address);//     www.jb51.net/119.75.218.70
} catch (UnknownHostException e) {
	e.printStackTrace();
}
>InetAddress.get Local Host()は、本機のipアドレスのホスト名を取得する。

try {
	InetAddress a = InetAddress.getLocalHost();
	System.out.println(a);//     -PC/  Ip
} catch (UnknownHostException e) {
	e.printStackTrace();
}
このクラスでよく使われる他のいくつかの方法:

try {
	InetAddress address=InetAddress.getLocalHost();
	System.out.println(address.getHostAddress());//  ip   
	System.out.println(address.getHostName());//     
	System.out.println(address.getCanonicalHostName());//        .     (lan)
} catch (UnknownHostException e) {			
	e.printStackTrace();		
}
get CanonicalHostName()方法
定義:public String getCannicalHostName()
この方法はget HostName法と同様に、リモートホストのドメイン名を取得するものである。この方法で得られたのはホスト名で、get HostNameから得られたのはホストの別名です。
1.get Local Host()を使ってInetAddressオブジェクトを作成する
この時get CanonicalHostName方法とget HostName方法で得られたのはすべて当機名です。
2.ドメイン名を使ってInetAddressオブジェクトを作成する
ドメイン名を使ってInetAddressオブジェクトを作成した場合、get HostNameメソッドはDNSサーバにアクセスしません。
しかし、get CanonicalHostName方法は必ずしもそうではない。これはDNSサーバがホスト名とホスト名をどう解釈するかによって決まる。
3.IPアドレスを使ってInetAddressオブジェクトを作成する
この時getCanonicalHostName方法とget HostName方法は全く同じで、戻ってくるのはホスト名であり、ホスト名ではない。
ホストの別名を使うのは、Oracle公式サイトのホスト名bigip-otn-potal.oracle.comなど、ホスト名が複雑な場合があるので、ユーザーがウェブサイトにアクセスするのが便利になるために、より簡単なホスト名を追加しました。
この文章は主にAndroid InetAddressの基礎入門の紹介とソースの実例を紹介しています。Androidの開発技術については下記の関連リンクをご覧ください。