10-1: マシンの情報の取得


・ まず最初にネットワークの機能を利用するために最低限必要な基礎知識について 簡単に復習しておきたいと思います。 インターネットに接続しているマシンは必ず一意の「番号」を割り振られています。 これが「IPアドレス」と呼ばれるものです。 マシンは IPアドレスによってお互いを識別します。 IPアドレスが正しく割り振られていることによって、 地球の裏側のマシンとも混乱せずに通信することが可能になるわけです。
 原理的には IPアドレスさえ与えられれば インターネット上の通信は可能となります。 ただし IPアドレスは、"202.11.98.135" というような、 お世辞にも馴染みやすいとは言えない形式で表されます。 コンピュータ同士がやり取りする分には問題ありませんが、 一般のユーザーがインターネット上のマシンを指定するためにはあまりに不便です。 そこで通常はマシンに固有な「マシン名」が定められます。
 インターネット上ではマシン名も一意に決める必要があります。 そのためにインターネットに接続している各機関のドメイン名を マシン名の一部に用います。たとえば "wakhok.ac.jp" という名前のドメインに 存在する "rishiri" という名前のマシンのマシン名は "rishiri.wakhok.ac.jp" と なるわけです。 こうしたマシン名は「DNS(Domain Name Service)」という仕組みによって管理されて います。DNSはインターネット上に分散化されたサービスです。 DNSに登録されたマシンは、 世界のどこからでもマシン名とIPアドレスの変換を行うことができます。

・ さて以上の説明のポイントは要するに次のようなことです。 ネットワーク上のマシンの情報として重要なのは、 「IPアドレス」と「マシン名」の2つです。 これらのうちのいずれかが与えられればマシンは一意に決まります。 java.netパッケージには インターネット上のマシンを特定するために InetAddress という名前のクラスが存在します。 InetAddress のオブジェクトがマシンそのものを表すと考えてもいいでしょう。 もちろん IPアドレスおよびマシン名の情報を取り出す機能も提供されます。 それを確かめるための簡単な サンプルプログラム MyHost.java から紹介しましょう。
 このプログラムは現在あなたが使用中のマシンの、 マシン名と IPアドレスを調べて標準出力に表示します。 InetAddress のようなネットワークを取り扱うクラスの多くは、 その実装がシステムに大きく依存します。 InetAddress にも publicなコンストラクタは存在しないので、 そのオブジェクトを得るためには専用の staticなメソッドを利用します。 getLocalHost()もしくは getByName()を呼び出してください。 現在使用中のマシンを表す InetAddressのオブジェクトは getLocalHost()メソッドによって得ることができます。
 いったん InetAddrssのオブジェクトが得られれば、 それからマシン名と IPアドレスの情報を取り出すことができます。 先のサンプルの場合は 表示されるマシン名にはドメイン名がを含まれていないでしょう。 ローカルなマシン名は DNSの助けを借りるまでもなくわかるからです。 なお、万一正しい情報が得られなかった場合には UnknownHostException が発生します。

・ 次にマシン名から IPアドレスの情報を、 あるいは逆に IPアドレスからマシン名の情報を取り出す サンプルプログラム HostInfo.java を紹介します。 これも非常に簡単に実現できます。
 getByName()は文字列の情報に対応する InetAddressの オブジェクトを返す staticなメソッドです。 引数の文字列はマシン名でも IPアドレス(の文字列表現)のいずれでも かまいません。 したがって以下のようにコマンドラインの引数に、 マシン名や IPアドレスを与えることで相互の変換結果が得られます。 (マシンが実在しても DNSのサービスが正しく受けられなかったり、 指定したマシンが DNSに登録されていない場合には、 変換はうまくいかないため IPアドレスのみが表示されます。)


java  HostInfo  java.sun.com
java  HostInfo  202.11.96.11

 インターネット上のマシン名と IPアドレスの対照は、 実際にはかなり複雑な機構なのですが、 Javaのプログラムではあっけないほど簡単に実現できてしまいます。 またマシン名の情報は、ローカルなマシン、LAN内、DNSなど複数の レベルで取得されるのですが、 その違いは Javaのプログラムの表面には現れません。 隣のマシンでも海外のマシンでも全く同様に取り扱える点にも注目してください。