Получение «внешнего» IP-адреса в Java - PullRequest
78 голосов
/ 30 мая 2010

Я не совсем уверен, как поступить с внешним 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 ]

157 голосов
/ 30 мая 2010

Я не уверен, что вы можете получить этот 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);
75 голосов
/ 27 января 2013

Один из комментариев @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();
                }
            }
        }
    }
}
16 голосов
/ 30 мая 2010

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

11 голосов
/ 30 июля 2012

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

10 голосов
/ 04 апреля 2014

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

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

Удачи!

5 голосов
/ 30 мая 2010

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

4 голосов
/ 12 декабря 2014

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

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 голосов
/ 29 сентября 2010

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

1 голос
/ 30 мая 2010

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

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

0 голосов
/ 15 апреля 2014
System.out.println(pageCrawling.getHtmlFromURL("http://ipecho.net/plain"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...