Android開発のInetAddress基礎入門概要とソースの例
5854 ワード
最近は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アドレスを含む。
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サーバにアクセスする必要がないとドメイン名が得られます。
定義: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の開発技術については下記の関連リンクをご覧ください。
実は一つのクラスの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の開発技術については下記の関連リンクをご覧ください。