ホスト名をもとにIPアドレスを取得 (Java)
[履歴] [最終更新] (2016/06/03 21:55:28)

概要

クラスライブラリjava.net.InetAddressを利用すると、あるホストのIPアドレスを取得できます。

sample.java

import java.net.InetAddress;

class Sample {
    public static void main(String args[]) {
        try {
            // IPアドレスの配列を取得します (あるホスト名に対して複数のIPが割り当てられていることがあります)
            InetAddress addrList[] = InetAddress.getAllByName(args[0]);

            for(int i=0; i<addrList.length; ++i) {
                System.out.println(addrList[i].getHostName()); //ホスト名
                System.out.println(addrList[i].getHostAddress()); //IPアドレス (文字列形式)

                byte bytes[] = addrList[i].getAddress(); //IPアドレス (バイト形式 (IPv4であれば4バイト))
                for(int j=0; j<bytes.length; ++j) {
                    if(bytes[j]>=0) System.out.print(bytes[j]);
                    else System.out.print(bytes[j] + 256); //2の補数で扱われる関係で負の数になってしまった場合の補正

                    if(j<bytes.length-1) System.out.print(".");
                }
                System.out.println("");
            }

            // ローカルホストのIP情報の取得に特化したメソッド
            InetAddress localHost = InetAddress.getLocalHost();
            // IP情報表示
            System.out.println(localHost.getHostName());
            System.out.println(localHost.getHostAddress());
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

実行例

$ javac sample.java && java Sample www.qoosky.io
www.qoosky.io
49.212.166.76
49.212.166.76
your-MacBook.local
192.168.0.1

2の補数の補正 (+256) について

具体例

ビット列11111111は、

  • 符号なし整数 (C/C++でいうところのunsigned) として捉えると255
  • 符号付き整数 (C/C++でいうところのsigned) として捉えると-1

であり、その差は255-(-1)=256です。そういう訳で、ビット列11111111を符号なし整数として処理するためには、符号付き整数としてJavaに認識されてしまった結果の-1に256を加算すればよいのです。

もう少し一般的な説明

ビット列1*******を符号なし整数として処理するためには、符号付き整数としてJavaに認識されてしまった結果に、補正分

1******* - (-(0%%%%%%%+1)) = (1*******+0%%%%%%%)+1 = 11111111 + 1 = 100000000 = 256

を加算すればよいのです。

関連ページ