■ IPアドレスが一つの場合
JavaでIPアドレスを取得するには、InetAddressクラスを使えば良いらしいです。
InetAddressクラスのgetLocalHostメソッドを使うことで、
Javaが動作している端末(サーバー)を表すInetAddressクラスを取得できます。そして、取得したInetAddressクラスでgetHostAddressメソッドを実行することでIPアドレスを取得できるようです。
これが、実際のサンプルです。
try {
// 自端末のInetAddressを取得
InetAddress testIP = java.net.InetAddress.getLocalHost();
// 取得した情報をログに出力
System.out.println("getLocalHost = [" + testIP.toString() + "]");
System.out.println("getHostName = [" + testIP.getHostName() + "]"); // ホスト名
System.out.println("getHostAddress = [" + testIP.getHostAddress() + "]"); // IPアドレス
} catch (UnknownHostException e1) {
e1.printStackTrace();
}
実行結果ログです。
getLocalHost = [testunix10.testdom.co.jp/10.11.25.180]
getHostName = [testunix10.testdom.co.jp]
getHostAddress = [10.11.25.180]
実行した端末のIPアドレスは「10.11.25.180」でホスト名は「testunix10」です。IPアドレスは思った通りに取得できたのですがホスト名にFQDNが返されてます。
JavaのAPI仕様によると「この InetAddress がホスト名を使用して作成された場合は、このホスト名が保存されて返されます。そうでない場合は、逆ネーム参照が実行されて、システムに設定されたネーム参照サービスに基づいて結果が返されます。」だそうです。
ふむ、InetAddressを作成する時にgetLocalHostメソッドホスト名を指定しないで使用(ホスト名を使用しないで作成)したので、IPアドレスから逆引きしてホスト名を探してきたってことのようです。
■ IPアドレスが複数の場合
障害対策とかいろいろな事情で、一つのサーバーが複数のIPアドレスを持っている事は珍しくなくなりました。その場合は、上記の方法ではうまく取得できないことがあるそうです(私の環境では特に問題なかったのですが)。
その場合は、NetworkInterfaceクラスを使えば良いそうです。
try {
// ネットワークインターフェイスを取得
Enumeration testMIP = NetworkInterface.getNetworkInterfaces();
// 取得できた場合、処理を行う
if (null != testMIP) {
// ネットワークインターフェイスの全件を処理する
while (testMIP.hasMoreElements()) {
// ネットワークインターフェイスを1件取得
NetworkInterface testNI = (NetworkInterface) testMIP.nextElement();
// ネットワークインターフェイスの表示名をログに出力
System.out.println("ネットワークインターフェイス【" + testNI.getDisplayName() + "】");
// ネットワークインターフェイスからInetAddressを取得
Enumeration testInA = testNI.getInetAddresses();
// InetAddressの全件を処理する
while (testInA.hasMoreElements()) {
// InetAddressを1件取得
InetAddress testIP = (InetAddress)testInA.nextElement();
// 取得した情報をログに出力
System.out.println("getLocalHost = [" + testIP.toString() + "]");
System.out.println("getCanonicalHostName = [" + testIP.getCanonicalHostName() + "]"); // ドメイン名
System.out.println("getHostName = [" + testIP.getHostName() + "]"); // ホスト名
System.out.println("getHostAddress = [" + testIP.getHostAddress() + "]"); // IPアドレス
}
}
} else {
System.out.println("ネットワークインターフェイス未取得");
}
} catch (SocketException e) {
System.out.println("ネットワークインターフェイス取得エラー");
e.printStackTrace();
}
大層な事をやっているのかと思ったら、最終的にはInetAddressクラスの取得方法がちょっと違うってだけのお話でした。
NetworkInterfaceクラスのgetNetworkInterfacesメソッドで全てのネットワークインターフェイスを取得して、そこからgetInetAddressesメソッドでInetAddressを取得。後は、取得したInetAddressで getHostAddressメソッドを実行するだけですね。
実行結果は下記の通りです。
ネットワークインターフェイス【sppp0】
getLocalHost = [/192.168.25.2]
getCanonicalHostName = [192.168.25.2]
getHostName = [192.168.25.2]
getHostAddress = [192.168.25.2]
ネットワークインターフェイス【bge1】
getLocalHost = [/10.11.25.179]
getCanonicalHostName = [10.11.25.179]
getHostName = [10.11.25.179]
getHostAddress = [10.11.25.179]
ネットワークインターフェイス【bge0】
getLocalHost = [/10.11.25.178]
getCanonicalHostName = [10.11.25.178]
getHostName = [10.11.25.178]
getHostAddress = [10.11.25.178]
getLocalHost = [/10.11.25.180]
getCanonicalHostName = [testunix10.testdom.co.jp]
getHostName = [testunix10.testdom.co.jp]
getHostAddress = [10.11.25.180]
ネットワークインターフェイス【lo0】
getLocalHost = [/127.0.0.1]
getCanonicalHostName = [localhost]
getHostName = [localhost]
getHostAddress = [127.0.0.1]
■ 後書き
実は、子会社との合併(
子会社との合併に伴うシステム移行 No1 始まり)に伴う移行作業のなかで必要性が生まれたのです。
今回の移行は数回に分けて行うのですが、移行が完了するまで触られると困る機能があったので機能制限をしようと思ったのです。
ところが、開発環境を子会社の人たちに教育用として開放するって想定があったため、単純に止めてしまうと教育で困ってしまいます。
そこで、IPアドレスを取得して開発環境のサーバー(IPアドレス)かどうかを判断しようと考えたのです。長期間使うのであればIPアドレスをハードコーディングするのは良くないのですが、数ヶ月の一時的な制御ならこれで十分です。
投稿記事の一覧:
http://harikofu.web.fc2.com/--- blog end ---
スポンサードリンク