1. 概要

IPアドレスまたはインターネットプロトコルアドレスは、インターネット上のデバイスを一意に識別します。 したがって、アプリケーションを実行しているデバイスのIDを知ることは、一部のアプリケーションの重要な部分です。

このチュートリアルでは、Javaを使用してコンピューターのIPアドレスを取得するためのさまざまな方法を確認します。

2. ローカルIPアドレスを見つける

まず、現在のマシンのローカルIPv4アドレスを取得するためのいくつかの方法を見てみましょう。

2.1. Javaネットライブラリを使用したローカルアドレス

この方法では、Javaネットライブラリを使用してUDP接続を確立します。

try (final DatagramSocket datagramSocket = new DatagramSocket()) {
    datagramSocket.connect(InetAddress.getByName("8.8.8.8"), 12345);
    return datagramSocket.getLocalAddress().getHostAddress();
}

ここでは、簡単にするために、宛先ホストとしてGoogleのプライマリDNSを使用し、IPアドレス8.8.8.8を提供しています。Javaネットライブラリは、この時点でアドレス形式の有効性のみをチェックするため、アドレス自体に到達できない可能性があります。 さらに、ランダムポート 12345 を使用して、 socket.connect()メソッドでUDP接続を作成しています。 内部的には、宛先ホストに実際に要求を送信することなく、マシンのローカルアドレスを含む、データの送受信に必要なすべての変数を設定します。

このソリューションはLinuxおよびWindowsマシンでは非常にうまく機能しますが、macOSでは問題があり、期待されるIPアドレスを返しません。

2.2. ソケット接続のあるローカルアドレス

または、信頼性の高いインターネット接続を介した ソケット接続を使用して、IPアドレスを検索できます。

try (Socket socket = new Socket()) {
    socket.connect(new InetSocketAddress("google.com", 80));
    return socket.getLocalAddress().getHostAddress();
}

ここでも簡単にするために、ポート80で接続されたgoogle.comを使用してホストアドレスを取得しました。 到達可能である限り、ソケット接続を作成するために他のURLを使用する場合があります。

2.3. 複雑なネットワーク状況に関する警告

上記の方法は、単純なネットワーク状況の場合に非常にうまく機能します。 ただし、マシンにさらに多くのネットワークインターフェイスがある場合、動作は予測できない可能性があります。

言い換えると、 上記の機能から返されるIPアドレスは、マシン上の優先ネットワークインターフェースのアドレスになります。 その結果、それは私たちが期待しているものとは異なる可能性があります。 特定のニーズについては、 サーバーに接続されているクライアントのIPアドレスを見つける

3. パブリックIPアドレスを見つける

ローカルIPアドレスと同様に、現在のマシンのパブリックIPアドレスを知りたい場合があります。 パブリックIPアドレスは、インターネットから到達可能なIPv4アドレスです。さらに、アドレスを検索しているマシンを一意に識別できない場合があります。 たとえば、同じルーターの下にある複数のホストは、同じパブリックIPアドレスを持っています。

簡単に言うと、Amazon AWS checkip.amazonaws.com URLに接続して、応答を読み取ることができます。

String urlString = "http://checkip.amazonaws.com/";
URL url = new URL(urlString);
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
    return br.readLine();
}

これはほとんどの場合うまく機能します。 ただし、信頼性を保証できない外部ソースに明示的に依存しています。 したがって、フォールバックとして、これらのURLのいずれかを使用して、パブリックIPアドレスを取得できます。

  • https://ipv4.icanhazip.com/
  • http://myexternalip.com/raw
  • http://ipecho.net/plain

4. 結論

この記事では、現在のマシンのIPアドレスを見つける方法と、Javaを使用してそれらを取得する方法を学びました。 また、ローカルIPアドレスとパブリックIPアドレスの両方をチェックするためのさまざまな方法についても検討しました。

そしていつものように、例のソースコードはGitHubから入手できます。