web-dev-qa-db-ja.com

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

ネットワーク外のコンピューターがそれを見るように、マシンの外部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;
    }
}
80
Julio

ローカルマシンで実行されるコードからその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);
160
bakkal

@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();
                }
            }
        }
    }
}
75
Will

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

16
bmargulies

@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 から

11
domih

これらはすべてまだ稼働中で、スムーズに動作しています! (2016年12月19日現在)

アドバイスの一部:そのうちの1つだけに直接依存しないでください。いずれかを使用しようとしますが、他を考慮した隣接計画があります!使用すればするほど良いです!

幸運を!

10
FranciscoBouza

Www.whatismyip.comなどのサイトへのHttpURLConnectionを作成し、それを解析します:-)

5
nc3b

これはどう?それはシンプルで、私にとって最高の働きをしました:)

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();
        }
    }
}
4
Sparkoenig

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

4
user461467

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

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

1
Jack
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
0
Mohsen Abasi

Javaベースのwebappを使用していて、クライアント(ブラウザ経由でリクエストを行う人)の外部IPを取得したい場合は、アプリをパブリックドメイン =およびrequest.getRemoteAddr()を使用して外部IPアドレスを読み取ります。

0
Jay