Получение "внешнего" 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;
    }
}

11 ответов


Я не уверен, что вы можете захватить этот 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);

один из комментариев @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();
                }
            }
        }
    }
}

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


все это еще и работает! (по состоянию на 19 декабря 2016)

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

удачи!


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


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


http://jstun.javawi.de/ будет делать - если ваш шлюз не оглушить )самое делать)


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

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

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

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


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


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