Uzyskiwanie 'zewnętrznego' adresu IP w Javie

Nie jestem zbyt pewien, jak zdobyć zewnętrzny adres IP maszyny, ponieważ komputer spoza sieci by to zobaczył.

Moja następująca Klasa IPAddress pobiera tylko lokalny adres IP maszyny.

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;
    }
}
Author: maytham-ɯɐɥʇʎɐɯ, 2010-05-30

12 answers

Nie jestem pewien, czy możesz pobrać ten adres IP z kodu, który działa na lokalnej maszynie.

Możesz jednak zbudować kod, który działa na stronie internetowej, powiedzmy w JSP, a następnie użyć czegoś, co zwraca adres IP, z którego pochodzi żądanie:

request.getRemoteAddr()

Lub po prostu użyj już istniejących usług, które to robią, a następnie przeanalizuj odpowiedź z usługi, aby dowiedzieć się o IP.

Użyj webservice jak AWS i inne

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);
 169
Author: bakkal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-19 09:33:55

Jeden z komentarzy @stivlo zasługuje na odpowiedź:

Możesz skorzystać z usługi 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();
                }
            }
        }
    }
}
 79
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-03 19:50:34

Prawda jest taka: "nie możesz" w tym sensie, że postawiłeś pytanie. NAT dzieje się poza protokołem. Nie ma możliwości, aby jądro Twojej maszyny dowiedziało się, jak twoja skrzynka NAT mapuje z zewnętrznych na wewnętrzne adresy IP. Inne odpowiedzi tutaj oferują sztuczki dotyczące metod rozmowy z zewnętrznymi stronami internetowymi.

 19
Author: bmargulies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-06 09:14:29

Wszystko to nadal działa i działa sprawnie! (od 23 września 2019)

Mała rada: nie polegaj bezpośrednio tylko na jednym z nich; staraj się go używać, ale miej Plan zgodności z innymi! Im więcej używasz, tym lepiej!

Powodzenia!

 14
Author: FranciscoBouza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-23 20:08:56

Jak napisał @ Donal Fellows, musisz odpytywać interfejs sieciowy zamiast maszyny. Ten kod z javadocs zadziałał dla mnie:

Poniższy przykładowy program wyświetla listę wszystkich interfejsów sieciowych i ich adresów na komputerze:

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");
     }
} 

Oto Przykładowe wyjście z przykładowego programu:

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

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

Od docs.oracle.com

 12
Author: domih,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-30 12:09:33

Zrobić HttpURLConnection do jakiejś strony jak www.whatismyip.com i parse that: -)

 6
Author: nc3b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 15:31:33

Co ty na to? To proste i działa najlepiej dla mnie:)

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();
        }
    }
}
 5
Author: Sparkoenig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 15:23:25

Http://jstun.javawi.de / zrobi to-pod warunkiem, że urządzenie gateway nie ogłuszy) większość robi)

 4
Author: user461467,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-29 08:02:00

Nie jest to takie proste, ponieważ urządzenie wewnątrz sieci LAN zwykle nie dba o zewnętrzny adres IP swojego routera do Internetu.. po prostu tego nie potrzebuje!

Sugerowałbym, abyś to wykorzystał otwierając stronę taką jak http://www.whatismyip.com/ i uzyskanie numeru IP przez parsowanie wyników html.. to nie powinno być takie trudne!

 1
Author: Jack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 15:31:43

Jeśli korzystasz z aplikacji webapp opartej na Javie i chcesz pobrać zewnętrzny adres IP klienta (tego, który wysyła żądanie za pośrednictwem przeglądarki), spróbuj wdrożyć aplikację w domenie publicznej i użyj request.getRemoteAddr() do odczytu zewnętrznego adresu IP.

 0
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 00:04:06
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
 0
Author: Mohsen Abasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 10:12:17

Alternatywnym rozwiązaniem jest wykonanie zewnętrznego polecenia, oczywiście rozwiązanie to ogranicza przenośność aplikacji.

Na przykład, dla aplikacji, która działa w systemie Windows, polecenie PowerShell może być wykonane przez jPowershell, jak pokazano w poniższym kodzie:

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;
}
 0
Author: Carlos Alma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-16 12:46:45