ネットワーク外のコンピューターがそれを見るように、マシンの外部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;
}
}
ローカルマシンで実行されるコードからその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);
@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();
}
}
}
}
}
真実は、あなたが問題を提起したという意味で「できません」です。 NATプロトコル外で発生します。マシンのカーネルがNATボックスが外部IPアドレスから内部IPアドレスにマッピングされる方法を知る方法はありません。他の回答ここでは、外部のWebサイトと対話する方法に関するトリックを提供します。
@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
これらはすべてまだ稼働中で、スムーズに動作しています! (2016年12月19日現在)
アドバイスの一部:そのうちの1つだけに直接依存しないでください。いずれかを使用しようとしますが、他を考慮した隣接計画があります!使用すればするほど良いです!
幸運を!
Www.whatismyip.comなどのサイトへのHttpURLConnectionを作成し、それを解析します:-)
これはどう?それはシンプルで、私にとって最高の働きをしました:)
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();
}
}
}
http://jstun.javawi.de/ はそれを実行します-ゲートウェイデバイスがSTUNを実行する場合はほとんど)
LAN内のマシンは通常、インターネットへのルーターの外部IPを気にしないため、それほど簡単ではありません。単にそれを必要としないだけです。
http://www.whatismyip.com/ のようなサイトを開き、htmlの結果を解析してIP番号を取得することで、これを悪用することをお勧めします。それほど難しくないはずです!
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
Javaベースのwebappを使用していて、クライアント(ブラウザ経由でリクエストを行う人)の外部IPを取得したい場合は、アプリをパブリックドメイン =およびrequest.getRemoteAddr()を使用して外部IPアドレスを読み取ります。