Javaで「外部」IPアドレスを取得する


83

ネットワーク外のコンピュータが見るように、マシンの外部IPアドレスを取得する方法がよくわかりません。

次のIPAddressクラスは、マシンのローカルIPアドレスのみを取得します。

public class IPAddress {

    private InetAddress thisIp;

    private String thisIpAddress;

    private void setIpAdd() {
        try {
            InetAddress thisIp = InetAddress.getLocalHost();
            thisIpAddress = thisIp.getHostAddress().toString();
        } catch (Exception e) {
        }
    }

    protected String getIpAddress() {
        setIpAdd();
        return thisIpAddress;
    }
}

13
マシンが一度に多くのパブリックアドレスを持つことができることを知っていますか?それらは実際にはマシンではなくネットワークインターフェースに関連付けられています。
ドナーフェロー2010年

回答:


168

ローカルマシンで実行されているコードからそのIPを取得できるかどうかはわかりません。

ただし、JSPなどのWebサイトで実行されるコードを作成してから、リクエストの送信元のIPを返すものを使用することはできます。

request.getRemoteAddr()

または、これを行う既存のサービスを使用して、サービスからの回答を解析してIPを見つけます。

AWSなどのWebサービスを使用する

import java.net.*;
import java.io.*;

URL whatismyip = new URL("http://checkip.amazonaws.com");
BufferedReader in = new BufferedReader(new InputStreamReader(
                whatismyip.openStream()));

String ip = in.readLine(); //you get the IP as a String
System.out.println(ip);

4
警告の言葉:彼らは自動化URLをautomation.whatismyip.com/n09230945.aspに
thegrinner 2011

8
そのうちの1つが現在ダウンしている場合に備えて、IPを提供するサーバーを少なくとも2つ実装することをお勧めします(もちろん正しいエラー処理を行います)。私の選択はexternalip.netです(「APIが必要ですか?」リンクをクリックしてください)。そのサイトを1年以上使用していて、今のところ問題はなく、常に迅速な応答を返す高速サービスです。

素晴らしいリンク; これを、大学のネットワーキング課題の概念実証の一部として使用します。
araisbec 2012年

もう1つの方法は、PHPを実行するWebサーバーまたはホストアカウントにアクセスできる場合、上記のコード@bakkalを使用して、を含む独自のPHPファイルを指定することですecho $_SERVER['REMOTE_ADDR'];。これがスクリプトの唯一または最初の出力行である場合は、すべて設定されています。
Kingsolmn 2013年

7
Whatsmyip.comは、このタイプの自動化をサポートしていないようです。
Kingsolmn 2013年

79

@stivloによるコメントの1つは答えに値します:

Amazonサービスhttp://checkip.amazonaws.comを使用できます

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class IpChecker {

    public static String getIp() throws Exception {
        URL whatismyip = new URL("http://checkip.amazonaws.com");
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(
                    whatismyip.openStream()));
            String ip = in.readLine();
            return ip;
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

19

真実は次のとおりです。「あなたは質問をしたという意味で「できません」。NATはプロトコルの外部で発生します。マシンのカーネルが、NATボックスが外部IPアドレスから内部IPアドレスにどのようにマッピングされているかを知る方法はありません。ここでの他の答えは、外部のWebサイトと話す方法を含むトリックを提供します。


3
それは元の質問に答えておらず、学術的な演習のように見えるので、そうでないかどうか
Bruno Bossola 2015年

公平を期すために、この回答は質問に回答し、他の12の回答はすべて基本的に同じことを言っていますが、外部IPチェッカーの任意の選択に固有のコードまたはURLを示しています。
トーマス・カーライル

14

これはすべてまだ順調に進んでいます!(2019年9月23日現在)

アドバイス:そのうちの1つだけに直接依存しないでください。1つを使用してみてくださいが、他の人を考慮した緊急時対応計画を立ててください。使うほど良い!

幸運を!


12

@Donal Fellowsが書いたように、マシンではなくネットワークインターフェイスにクエリを実行する必要があります。javadocsからのこのコードは私のために働いた:

次のサンプルプログラムは、マシン上のすべてのネットワークインターフェイスとそのアドレスを一覧表示します。

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNets {

    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
} 

以下は、サンプルプログラムからの出力例です。

Display name: TCP Loopback interface
Name: lo
InetAddress: /127.0.0.1

Display name: Wireless Network Connection
Name: eth0
InetAddress: /192.0.2.0

docs.oracle.comから


1
ありがとうございました!このソリューションは、ソフトウェアがNATの背後にある場合は機能しませんが、NATの背後にないことがわかっているサーバーソフトウェアの場合、またはソフトウェアが別のサーバーに接続して独自のサーバーを取得できない場合のフォールバックとして非常に役立ちます。 IP。特にインターネットから切断されたLAN上で実行することを目的としたソフトウェアの場合、それは進むべき道です。
pavon 2012年

6

www.whatismyip.comのようないくつかのサイトへのHttpURLConnectionを作成し、それを解析します:-)


5

これはどう?それはシンプルで私にとって最高に機能しました:)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;


public class IP {
    public static void main(String args[]) {
        new IP();
    }

    public IP() {
        URL ipAdress;

        try {
            ipAdress = new URL("http://myexternalip.com/raw");

            BufferedReader in = new BufferedReader(new InputStreamReader(ipAdress.openStream()));

            String ip = in.readLine();
            System.out.println(ip);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

これは素晴らしいです!家に帰ったらやってみます。これはまさに私が探していた問題解決の種類です。なぜそれが高く投票されなかったのかわからない。
Adam893 2017

4

http://jstun.javawi.de/がそれを行います-ゲートウェイデバイスがSTUNを実行する場合)ほとんどが実行します)


1
非常に興味深いことに、外部サービスを使用せずにゲートウェイと通信するだけで、期待どおりに機能します。しかし、GPLライセンスはおそらくその採用を制限するでしょう。
Bruno Bossola 2015年

サイトからログイン画面が表示されます。おそらくオリジナルではありません。
jus12 2016

1

LAN内のマシンは通常、インターネットへのルーターの外部IPを気にしないため、それほど簡単ではありません。単にそれを必要としないのです。

http://www.whatismyip.com/のようなサイトを開き、htmlの結果を解析してIP番号を取得することで、これを悪用することをお勧めします。それほど難しいことではありません。


2
HTMLを解析する必要はありません。whatismyip.comのWebページソースの最初の行は外部IPです。
Martijn Courteaux 2010年

0

JAVAベースのWebアプリを使用していて、クライアント(ブラウザーを介して要求を行う人)の外部IPを取得する場合は、パブリックドメインにアプリをデプロイし、request.getRemoteAddr()を使用して外部IPアドレスを読み取ります。



0

別の解決策は、外部コマンドを実行することです。明らかに、この解決策はアプリケーションの移植性を制限します。

たとえば、Windowsで実行されるアプリケーションの場合、次のコードに示すように、PowerShellコマンドをjPowershellから実行できます。

public String getMyPublicIp() {
    // PowerShell command
    String command = "(Invoke-WebRequest ifconfig.me/ip).Content.Trim()";
    String powerShellOut = PowerShell.executeSingleCommand(command).getCommandOutput();

    // Connection failed
    if (powerShellOut.contains("InvalidOperation")) {
        powerShellOut = null;
    }
    return powerShellOut;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.