アドレス


IP とホスト名

まず、何はともあれホストコンピュータにアクセスできなければ始まりません
何らかのコンピュータをネットワークから探し、接続する必要があります

このとき、コンピュータを検出する方法は IP を用います
IP は ***.***.***.*** という形式の32ビットで表現される識別子です
それぞれの *** には 0 〜 255 までのいずれかの数値が入ります

もしくは、ホスト名を用いてコンピュータを探す方法があります
これは、お馴染みの java.sun.com というような文字による識別です
この場合、一度 DNS サーバーに接続して IP に変換する必要があります

Java ネットワーク API では、コンピュータを識別する IP を
java.net.InetAddress クラスにパッケージ化しています

public final class InetAddress extends Object implements Serializable

このクラスは、コンストラクタを公開していません
これは、IP の初期化には様々な手続きが必要だからと考えられます
そのため、InetAddress クラスのインスタンスを作成するためには
静的メソッド InetAddress.getByName() メソッドを使います
public static InetAddress getByName(String host)
				throws UnknownHostException
host には、ホスト名を指定します
ホスト名は「java.sun.com」のようなマシン名か
「206.26.48.100」のような IP アドレスの文字列表現になります
このメソッドは指定したホストの IP を示す InetAddress を返します

指定したアドレスが発見できなかった場合は UnkownHostException が発生します
また、セキュリティによっては SecurityException が発生する可能性もあります

IP アドレスを取得するには InetAddress.getHostAddress()
ホスト名を得るには InetAddress.getHostName() メソッドを使います
例えばホスト名で取得した InetAddress から IP を取得するという場合
getHostAddress() メソッドを用いて IP アドレスの文字列表現を得られます

public String getHostAddress()
public String getHostName()

これらのメソッドを用いて、InetAddress が表しているホストコンピュータを得られます
様々な Java ネットワーク API において、コンピュータを識別するには
この InetAddress クラスを用いるため、このクラスは基本中の基本なのです
また、アドレスを InetAddress クラスで表すことで抽象化しているため
IPv6 へ移行したときも、コードの変更は最小ですむのです
import java.net.*;

public class Test {
	public static void main(String[] args) {
		InetAddress host = null;
		try {
			host = InetAddress.getByName(args[0]);
		}
		catch(UnknownHostException e) {
			System.out.println("Not found " + args[0]);
			return;
		}
		System.out.println("Host name = " + host.getHostName());
		System.out.println("IP = " + host.getHostAddress());
	}
}
このプログラムは、コマンドライン引数でホストアドレスを指定します
すると、指定したアドレスのホスト名と IP を表示します
コマンドラインから指定するのはホスト名でも IP でもかまいません

ホストを検索する時、基本的にはホスト名を用いるべきです
そうすることで、IP を隠蔽できるため、IPv6 への以降が必要なときや
ホストコンピュータが IP を変更した時、コードを書き直す必要がないからです


複数のIPを持つホスト名

実は、ホスト名は複数の IP に関連付けられていることがあります
つまり、コンピュータが複数のアドレスを持っている状態です
この場合、InetAddress.getAllByName() を使います
public static InetAddress[] getAllByName(String host)
				throws UnknownHostException
host にはホスト名を指定します
これは getByName() メソッドと同様に名前でもIPでもかまいません
メソッドは 指定されたホスト名のすべての IP アドレスを含む配列を返します
import java.net.*;

public class Test {
	public static void main(String[] args) {
		InetAddress[] host = null;
		try {
			host = InetAddress.getAllByName(args[0]);
		}
		catch(UnknownHostException e) {
			System.out.println("Not found " + args[0]);
			return;
		}
		for(int i = 0 ; i < host.length ; i++)
			System.out.println(host[i]);
	}
}
このプログラムは、コマンドラインで指定したホストがもつ
全ての IP を標準出力に列挙するというものです
例えば、2002 年現在では Microsoft の Web サーバーは複数のIPを持っています
microsoft.com を入力して試してみると、複数の IP が列挙されるでしょう


ローカルホスト

InetAddress クラスは、プログラムを実行コンピュータの
ホスト名や IP を得る方法も提供しています
つまり、ローカルホストの InetAddress を取得できます

これには InetAddress.getLocalHost() メソッドを使います
public static InetAddress getLocalHost()
			throws UnknownHostException
このメソッドは、ローカルホストの InetAddress を返します
import java.net.*;

public class Test {
	public static void main(String[] args) {
		InetAddress host = null;
		try {
			host = InetAddress.getLocalHost();
		}
		catch(UnknownHostException e) {
			System.err.println(e);
			return;
		}
		System.out.println(host);
	}
}
このプログラムは、ローカルホストのホスト名とIPを表示します
筆者のコンピュータでは次のような結果になりました

RENA/192.168.0.2

RENA はこのコンピュータの名前で、192.168.0.2 がこのときの IP です



前のページへ戻る次のページへ