Подтвердить что ты не робот

Получение "внешнего" IP-адреса в Java

Я не слишком уверен, как можно получить внешний 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;
    }
}
4b9b3361

Ответ 1

Я не уверен, что вы можете захватить этот IP-код из кода, который выполняется на локальной машине.

Однако вы можете создать код, который выполняется на веб-сайте, например, в JSP, а затем использовать что-то, что возвращает IP-адрес, откуда пришел запрос:

request.getRemoteAddr()

Или просто используйте уже существующие службы, которые это делают, затем проанализируйте ответ от службы, чтобы узнать IP.

Используйте веб-сервис, такой как AWS и другие

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

Ответ 2

Один из комментариев от @stivlo заслуживает ответа:

Вы можете использовать службу 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();
                }
            }
        }
    }
}

Ответ 3

Истина заключается в том, что "вы не можете" в том смысле, что задали вопрос. NAT происходит за пределами протокола. Ядро устройства не имеет способа узнать, как ваш ящик NAT сопоставляется с внешними внутренними IP-адресами. Другие ответы здесь предлагают трюки, связанные с методами общения с внешними веб-сайтами.

Ответ 4

Как писал @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

Ответ 5

Все это все еще работает и работает гладко! (по состоянию на 23 сентября 2019 года)

Совет: не зависите напрямую от одного из них; Попробуйте использовать один, но составьте план на случай непредвиденных обстоятельств, учитывая другие! Чем больше вы используете, тем лучше!

Удачи!

Ответ 6

Сделайте HttpURLConnection на каком-либо сайте, например www.whatismyip.com, и проанализируйте, что: -)

Ответ 7

http://jstun.javawi.de/ будет делать это - при условии, что ваше шлюзовое устройство делает STUN) больше всего)

Ответ 8

Как насчет этого? Он прост и работал лучше для меня:)

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

Ответ 9

Это не так просто, потому что машина внутри локальной сети обычно не заботится о внешнем IP-адресе своего маршрутизатора в интернете.. она просто не нужна!

Я предлагаю вам воспользоваться этим, открыв сайт, например http://www.whatismyip.com/ и получив IP-номер, проанализировав результаты html. это не должно быть так сложно!

Ответ 10

Если вы используете веб-приложение на основе JAVA, и если вы хотите захватить клиента (тот, кто делает запрос через браузер), внешний ip попытается развернуть приложение в общедоступном домене и использовать request.getRemoteAddr(), чтобы прочитать внешний IP-адрес.

Ответ 11

System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));