Obtendo o endereço IP da máquina atual usando Java

291

Estou tentando desenvolver um sistema em que existem diferentes nós que são executados em um sistema diferente ou em portas diferentes no mesmo sistema.

Agora, todos os nós criam um soquete com um IP de destino como o IP de um nó especial conhecido como nó de autoinicialização. Os nós criam seus próprios ServerSockete começam a ouvir conexões.

O nó de inicialização mantém uma lista de nós e os retorna quando são consultados.

Agora, o que eu preciso é que o nó deve registrar seu IP no nó de inicialização. Eu tentei usar cli.getInetAddress()uma vez que o cliente se conecta ao ServerSocketnó de inicialização, mas isso não funcionou.

  1. Preciso que o cliente registre seu IP PPP, se disponível;
  2. Caso contrário, o IP da LAN, se disponível;
  3. Caso contrário, ele deve registrar 127.0.0.1, assumindo que é o mesmo computador.

Usando o código:

System.out.println(Inet4Address.getLocalHost().getHostAddress());

ou

System.out.println(InetAddress.getLocalHost().getHostAddress());

Meu endereço IP de conexão PPP é: 117.204.44.192, mas o acima me retorna 192.168.1.2

EDITAR

Estou usando o seguinte código:

Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
    NetworkInterface n = (NetworkInterface) e.nextElement();
    Enumeration ee = n.getInetAddresses();
    while (ee.hasMoreElements())
    {
        InetAddress i = (InetAddress) ee.nextElement();
        System.out.println(i.getHostAddress());
    }
}

Consigo obter todos os endereços IP associados a todos os NetworkInterfaces, mas como os distingo? Esta é a saída que estou recebendo:

127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
Sasidhar
fonte
Inet4Address.getLocalHost () deve funcionar certo?
Sears India
3
Dentro do loop, se eu adicionar n.isPointToPoint (), isso funcionará? Minha idéia é retornar "127.0.0.1" se nenhuma rede ponto a ponto for encontrada. Isso vai funcionar?
23412 Sasidhar
3
@sidid: Por favor, não poste seu endereço IP original. escreva 117.xxx.xxx.xxx, para IP privado, tudo bem.
now cow
@GagandeepBali Obrigado pelo conselho, mas meu IP é um IP dinâmico e recebo um novo IP toda vez que desconecto e conecto minha Internet. Portanto, não deve ser um problema, eu acho.
2141212 sasidhar
2
Relacionados: stackoverflow.com/questions/6064510/...
AlikElzin-Kilaka

Respostas:

115
import java.net.DatagramSocket;
import java.net.InetAddress;

try(final DatagramSocket socket = new DatagramSocket()){
  socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
  ip = socket.getLocalAddress().getHostAddress();
}

Dessa forma, funciona bem quando há várias interfaces de rede. Ele sempre retorna o IP de saída preferido. O destino 8.8.8.8não é necessário para estar acessível.

Connectem um soquete UDP tem o seguinte efeito: define o destino para Send / Recv, descarta todos os pacotes de outros endereços e - que é o que usamos - transfere o soquete para o estado "conectado", define seus campos apropriados. Isso inclui verificar a existência da rota para o destino de acordo com a tabela de roteamento do sistema e definir o terminal local de acordo. A última parte parece não estar oficialmente documentada, mas parece uma característica integrante da API de soquetes de Berkeley (um efeito colateral do estado "conectado" do UDP) que funciona de maneira confiável no Windows e Linux em versões e distribuições.

Portanto, esse método fornecerá o endereço local que seria usado para conectar-se ao host remoto especificado. Não há uma conexão real estabelecida; portanto, o ip remoto especificado pode estar inacessível.

Editar:

Como @macomgil diz, para o MacOS, você pode fazer isso:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());
Mr.Wang da porta ao lado
fonte
7
Funcionou para mim no linux, mas no OsX recebo: "0.0.0.0"
Radu Toader
@ Jeef, a resposta é atualizada. Se não funcionar no OsX, você precisará escolher outra maneira.
Mr.Wang da Next Door
1
Brilhante! FYI, quando se lida com a rede interna fechado, basta substituir 8.8.8.8 com algo cada host pode chegar
Murphy Ng
Funciona no Windows; podemos confirmar se o OSX ainda é um problema?
trilogia
4
@trilogy ainda estou recebendo 0.0.0.0 no OSX
Peter Tutervai
273

Isso pode ser um pouco complicado no caso mais geral.

Em face disso, InetAddress.getLocalHost()deve fornecer o endereço IP deste host. O problema é que um host pode ter muitas interfaces de rede e uma interface pode estar vinculada a mais de um endereço IP. Além disso, nem todos os endereços IP podem ser alcançados fora da sua máquina ou da sua LAN. Por exemplo, eles podem ser endereços IP para dispositivos de rede virtual, endereços IP de rede privada e assim por diante.

O que isso significa é que o endereço IP retornado por InetAddress.getLocalHost()pode não ser o correto a ser usado.

Como você pode lidar com isso?

  • Uma abordagem é usar NetworkInterface.getNetworkInterfaces()para obter todas as interfaces de rede conhecidas no host e iterar nos endereços de cada NI.
  • Outra abordagem é (de alguma forma) obter o FQDN anunciado externamente para o host e usar InetAddress.getByName()para procurar o endereço IP principal. (Mas como você o obtém e como lida com um balanceador de carga baseado em DNS?)
  • Uma variação do anterior é obter o FQDN preferido de um arquivo de configuração ou de um parâmetro de linha de comando.
  • Outra variação é obter o endereço IP preferido de um arquivo de configuração ou de um parâmetro de linha de comando.

Em resumo, InetAddress.getLocalHost()normalmente funcionará, mas pode ser necessário fornecer um método alternativo para os casos em que seu código é executado em um ambiente com rede "complicada".


Consigo obter todos os endereços IP associados a todas as interfaces de rede, mas como faço para distingui-los?

  • Qualquer endereço no intervalo 127.xxx.xxx.xxx é um endereço de "loopback". É visível apenas para "este" host.
  • Qualquer endereço no intervalo 192.168.xxx.xxx é um endereço IP privado (também conhecido como local do site). Eles são reservados para uso em uma organização. O mesmo se aplica aos endereços 10.xxx.xxx.xxx e 172.16.xxx.xxx a 172.31.xxx.xxx.
  • Endereços no intervalo 169.254.xxx.xxx são endereços IP locais de link. Eles são reservados para uso em um único segmento de rede.
  • Endereços no intervalo 224.xxx.xxx.xxx a 239.xxx.xxx.xxx são endereços multicast.
  • O endereço 255.255.255.255 é o endereço de broadcast.
  • Qualquer outra coisa deve ser um endereço IPv4 ponto a ponto público válido.

De fato, a API InetAddress fornece métodos para testar loopback, link local, local do site, endereços de difusão seletiva e difusão. Você pode usá-los para descobrir qual dos endereços IP que você recebe é o mais apropriado.

Stephen C
fonte
3
Caso alguém esteja curioso, o getLocalHost faz essencialmente uma pesquisa de DNS no nome do host do servidor. Se ele obtiver um endereço IP dessa pesquisa, ele pesquisará nas interfaces disponíveis para ver qual interface possui esse endereço IP e retornará essa interface. Isso significa que o getLocalHost tenderá a funcionar em um ambiente de "servidor" em que o IP de saída é aquele que mapeia o nome do host do servidor.
Pace
1
No Ubuntu 14.04, essa API retorna 127.0.1.1, embora o ifconfig relate apenas duas interfaces, a que eu quero (o endereço IP acessível ao público) e o loopback (127.0.0.1). Estranho que ele retorne um alias de loopback diferente.
ctpenrose
Acrescentarei que, se você use getLocalHost().getHostAddress()publicar algo, poderá ver 0.0.0.0ao procurar em outro computador na rede. Isto é explicado aqui Isto é o que aconteceu comigo quando eu estava usando Gazebo em dois computadores
Peter Mitrano
57

A publicação aqui do código de solução alternativa de ambiguidade de IP testado em https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () ambígua em sistemas Linux):

/**
 * Returns an <code>InetAddress</code> object encapsulating what is most likely the machine's LAN IP address.
 * <p/>
 * This method is intended for use as a replacement of JDK method <code>InetAddress.getLocalHost</code>, because
 * that method is ambiguous on Linux systems. Linux systems enumerate the loopback network interface the same
 * way as regular LAN network interfaces, but the JDK <code>InetAddress.getLocalHost</code> method does not
 * specify the algorithm used to select the address returned under such circumstances, and will often return the
 * loopback address, which is not valid for network communication. Details
 * <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4665037">here</a>.
 * <p/>
 * This method will scan all IP addresses on all network interfaces on the host machine to determine the IP address
 * most likely to be the machine's LAN address. If the machine has multiple IP addresses, this method will prefer
 * a site-local IP address (e.g. 192.168.x.x or 10.10.x.x, usually IPv4) if the machine has one (and will return the
 * first site-local address if the machine has more than one), but if the machine does not hold a site-local
 * address, this method will return simply the first non-loopback address found (IPv4 or IPv6).
 * <p/>
 * If this method cannot find a non-loopback address using this selection algorithm, it will fall back to
 * calling and returning the result of JDK method <code>InetAddress.getLocalHost</code>.
 * <p/>
 *
 * @throws UnknownHostException If the LAN address of the machine cannot be found.
 */
private static InetAddress getLocalHostLANAddress() throws UnknownHostException {
    try {
        InetAddress candidateAddress = null;
        // Iterate all NICs (network interface cards)...
        for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
            NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
            // Iterate all IP addresses assigned to each card...
            for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
                InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
                if (!inetAddr.isLoopbackAddress()) {

                    if (inetAddr.isSiteLocalAddress()) {
                        // Found non-loopback site-local address. Return it immediately...
                        return inetAddr;
                    }
                    else if (candidateAddress == null) {
                        // Found non-loopback address, but not necessarily site-local.
                        // Store it as a candidate to be returned if site-local address is not subsequently found...
                        candidateAddress = inetAddr;
                        // Note that we don't repeatedly assign non-loopback non-site-local addresses as candidates,
                        // only the first. For subsequent iterations, candidate will be non-null.
                    }
                }
            }
        }
        if (candidateAddress != null) {
            // We did not find a site-local address, but we found some other non-loopback address.
            // Server might have a non-site-local address assigned to its NIC (or it might be running
            // IPv6 which deprecates the "site-local" concept).
            // Return this non-loopback candidate address...
            return candidateAddress;
        }
        // At this point, we did not find a non-loopback address.
        // Fall back to returning whatever InetAddress.getLocalHost() returns...
        InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
        if (jdkSuppliedAddress == null) {
            throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
        }
        return jdkSuppliedAddress;
    }
    catch (Exception e) {
        UnknownHostException unknownHostException = new UnknownHostException("Failed to determine LAN address: " + e);
        unknownHostException.initCause(e);
        throw unknownHostException;
    }
}
Vadzim
fonte
6
Deve-se notar que isso ainda não resolve a ambuguidade, caso o host tenha várias interfaces de nerwork semelhantes.
Vadzim
1
a resposta abaixo é melhor - stackoverflow.com/questions/9481865/… obtém o endereço IP local que é usado como src para Gatway padrão
Radu Toader
Por que o endereço IP é adicionado com a barra ..? como / 10.39.0.17 ..?, é sempre assim que deve ser aparado ..?
Kanagavelu Sugumar
51

Você pode usar a classe InetAddress do java para esse fim.

InetAddress IP=InetAddress.getLocalHost();
System.out.println("IP of my system is := "+IP.getHostAddress());

Saída para o meu sistema = IP of my system is := 10.100.98.228

retorna getHostAddress ()

Retorna a string do endereço IP na apresentação textual.

OU você também pode fazer

InetAddress IP=InetAddress.getLocalHost();
System.out.println(IP.toString());

Saída = IP of my system is := RanRag-PC/10.100.98.228

RanRag
fonte
9
Observe que 10.xxx é um endereço privado, indicando que seu sistema está em uma rede NAT. Ele aparecerá como um endereço diferente ao entrar em contato com o mundo exterior. Se você realmente precisa do endereço IP externo, precisará entrar em contato com um dos muitos sites que retornarão o endereço IP de onde você é. Isso pode ou não ser útil para você. Seu sistema quase certamente não poderá ser acessado de fora em nenhum caso.
Edward Falk
19

Ao procurar seu endereço "local", observe que cada máquina não possui apenas uma única interface de rede e cada interface pode ter seu próprio endereço local. O que significa que sua máquina sempre possui vários endereços "locais".

Diferentes endereços "locais" serão automaticamente escolhidos para uso quando você estiver se conectando a diferentes pontos de extremidade. Por exemplo, quando você se conecta google.com, está usando um endereço local "externo"; mas quando você se conecta ao seulocalhost , seu endereço local sempre é o localhostpróprio, porque localhost é apenas um loopback.

Abaixo está mostrando como descobrir seu endereço local quando você está se comunicando com google.com:

Socket socket = new Socket();
socket.connect(new InetSocketAddress("google.com", 80));
System.out.println(socket.getLocalAddress());
macomgil
fonte
Impressionante !! - tão fácil :)
smilyface
4
adicionar socket.close () no final :)
MC
11

Exemplo em scala (útil no arquivo sbt):

  import collection.JavaConverters._
  import java.net._

  def getIpAddress: String = {

    val enumeration = NetworkInterface.getNetworkInterfaces.asScala.toSeq

    val ipAddresses = enumeration.flatMap(p =>
      p.getInetAddresses.asScala.toSeq
    )

    val address = ipAddresses.find { address =>
      val host = address.getHostAddress
      host.contains(".") && !address.isLoopbackAddress
    }.getOrElse(InetAddress.getLocalHost)

    address.getHostAddress
  }
Andrzej Jozwik
fonte
10

EDIT 1: O código atualizado, desde o link anterior, não existe mais

import java.io.*;
import java.net.*;

public class GetMyIP {
    public static void main(String[] args) {
        URL url = null;
        BufferedReader in = null;
        String ipAddress = "";
        try {
            url = new URL("http://bot.whatismyipaddress.com");
            in = new BufferedReader(new InputStreamReader(url.openStream()));
            ipAddress = in.readLine().trim();
            /* IF not connected to internet, then
             * the above code will return one empty
             * String, we can check it's length and
             * if length is not greater than zero, 
             * then we can go for LAN IP or Local IP
             * or PRIVATE IP
             */
            if (!(ipAddress.length() > 0)) {
                try {
                    InetAddress ip = InetAddress.getLocalHost();
                    System.out.println((ip.getHostAddress()).trim());
                    ipAddress = (ip.getHostAddress()).trim();
                } catch(Exception exp) {
                    ipAddress = "ERROR";
                }
            }
        } catch (Exception ex) {
            // This try will give the Private IP of the Host.
            try {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                ipAddress = (ip.getHostAddress()).trim();
            } catch(Exception exp) {
                ipAddress = "ERROR";
            }
            //ex.printStackTrace();
        }
        System.out.println("IP Address: " + ipAddress);
    }
}

VERSÃO REAL: Isso parou de funcionar

Esperamos que este trecho possa ajudá-lo a conseguir isso:

// Method to get the IP Address of the Host.
private String getIP()
{
    // This try will give the Public IP Address of the Host.
    try
    {
        URL url = new URL("http://automation.whatismyip.com/n09230945.asp");
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String ipAddress = new String();
        ipAddress = (in.readLine()).trim();
        /* IF not connected to internet, then
         * the above code will return one empty
         * String, we can check it's length and
         * if length is not greater than zero, 
         * then we can go for LAN IP or Local IP
         * or PRIVATE IP
         */
        if (!(ipAddress.length() > 0))
        {
            try
            {
                InetAddress ip = InetAddress.getLocalHost();
                System.out.println((ip.getHostAddress()).trim());
                return ((ip.getHostAddress()).trim());
            }
            catch(Exception ex)
            {
                return "ERROR";
            }
        }
        System.out.println("IP Address is : " + ipAddress);

        return (ipAddress);
    }
    catch(Exception e)
    {
        // This try will give the Private IP of the Host.
        try
        {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println((ip.getHostAddress()).trim());
            return ((ip.getHostAddress()).trim());
        }
        catch(Exception ex)
        {
            return "ERROR";
        }
    }
}
nIcE cow
fonte
2
A solução funcionaria, espero que esteja sempre conectado à Internet, mas não tenho garantia disso. Além disso, quando o sistema não está conectado à Internet e preciso retornar o endereço IP da LAN do sistema, se houver, caso contrário, o host local. Portanto, não é uma opção viável para mim. Qualquer outra maneira??
23412 sasidhar
@sid: Quando você está conectado à Internet, só então você está tendo seu IP público, eu acho que, se você não estiver conectado, esse método fornecerá o seu IP local ou IP da LAN e a última condição especificada por você você pode retornar "127.0.0.1", em vez de retornar erro.
nIcE cow
1
Eu gosto da sua abordagem, mas esse link parece não funcionar mais !! Posso colocar um controlador no meu próprio sistema para funcionar em vez do link externo e, portanto, ser mais confiável ??
Azerafati 27/08/14
1
@ Bludream: Muito obrigado por trazer isso ao meu conhecimento, que o link não está mais funcionando. Eu atualizei o post, com algumas novas entradas. Espero que funcione para sua base de usuários. Em relação à sua pergunta, eu realmente não sei, como configurar um controlador em seu próprio sistema para fazê-lo funcionar. Portanto, não poderei dar dicas sobre esse tópico, MEU MAU. Mais uma vez obrigado e KEEP SORRISO :-)
nIcE cow
1
Por mais que seja uma solução legal, é extremamente não confiável. Se você bloquear o encadeamento principal (digamos) e, por algum motivo, estiver whatismyip.cominativo por algum tempo, seu aplicativo também ficará inativo :(. Ou retornará dados de lixo e causará um comportamento inesperado. Além disso, isso retornará o outter a maioria dos endereços IP detectáveis ​​por whatismyip.com, não necessariamente o endereço IP da máquina que você está usando.
Decoded
6

primeiro, importe a classe

import java.net.InetAddress;

em aula

  InetAddress iAddress = InetAddress.getLocalHost();
  String currentIp = iAddress.getHostAddress();
  System.out.println("Current IP address : " +currentIp); //gives only host address
Gautam
fonte
2
fornece apenas o primeiro endereço IP, mesmo que não seja o usado!
Yahya
6

Você pode usar a java.net.InetAddressAPI. Tente o seguinte:

InetAddress.getLocalHost().getHostAddress();
Ved
fonte
5
só retornará 127.0.0.1
HCarrasko 15/01
5
private static InetAddress getLocalAddress(){
        try {
            Enumeration<NetworkInterface> b = NetworkInterface.getNetworkInterfaces();
            while( b.hasMoreElements()){
                for ( InterfaceAddress f : b.nextElement().getInterfaceAddresses())
                    if ( f.getAddress().isSiteLocalAddress())
                        return f.getAddress();
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return null;
    }
JR
fonte
1
por favor, considere adicionar uma explicação sobre o que seu código faz.
precisa saber é o seguinte
4

Este é um exemplo de trabalho da resposta ACEITADA acima! Essa classe NetIdentity armazenará o IP do host interno e o loopback local. Se você estiver em um servidor baseado em DNS, conforme mencionado acima, talvez seja necessário adicionar mais verificações ou, possivelmente, ir na rota do arquivo de configuração.

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * Class that allows a device to identify itself on the INTRANET.
 * 
 * @author Decoded4620 2016
 */
public class NetIdentity {

    private String loopbackHost = "";
    private String host = "";

    private String loopbackIp = "";
    private String ip = "";
    public NetIdentity(){

        try{
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();

            while(interfaces.hasMoreElements()){
                NetworkInterface i = interfaces.nextElement();
                if(i != null){
                    Enumeration<InetAddress> addresses = i.getInetAddresses();
                    System.out.println(i.getDisplayName());
                    while(addresses.hasMoreElements()){
                        InetAddress address = addresses.nextElement();
                        String hostAddr = address.getHostAddress();

                        // local loopback
                        if(hostAddr.indexOf("127.") == 0 ){
                            this.loopbackIp = address.getHostAddress();
                            this.loopbackHost = address.getHostName();
                        }

                        // internal ip addresses (behind this router)
                        if( hostAddr.indexOf("192.168") == 0 || 
                                hostAddr.indexOf("10.") == 0 || 
                                hostAddr.indexOf("172.16") == 0 ){
                            this.host = address.getHostName();
                            this.ip = address.getHostAddress();
                        }


                        System.out.println("\t\t-" + address.getHostName() + ":" + address.getHostAddress() + " - "+ address.getAddress());
                    }
                }
            }
        }
        catch(SocketException e){

        }
        try{
            InetAddress loopbackIpAddress = InetAddress.getLocalHost();
            this.loopbackIp = loopbackIpAddress.getHostName();
            System.out.println("LOCALHOST: " + loopbackIp);
        }
        catch(UnknownHostException e){
            System.err.println("ERR: " + e.toString());
        }
    }

    public String getLoopbackHost(){
        return loopbackHost;
    }

    public String getHost(){
        return host;
    }
    public String getIp(){
        return ip;
    }
    public String getLoopbackIp(){
        return loopbackIp;
    }
}

Quando executo esse código, na verdade, recebo uma impressão assim:

    Software Loopback Interface 1
        -127.0.0.1:127.0.0.1 - [B@19e1023e
        -0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
        -VIKING.yourisp.com:192.168.1.142 - [B@64b8f8f4
        -fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
Intel Edison USB RNDIS Device
Driver for user-mode network applications
Cisco Systems VPN Adapter for 64-bit Windows
VirtualBox Host-Only Ethernet Adapter
        -VIKING:192.168.56.1 - [B@3cd1f1c8
        -VIKING:fe80:0:0:0:d599:3cf0:5462:cb7%eth4 - [B@3a4afd8d
LogMeIn Hamachi Virtual Ethernet Adapter
        -VIKING:25.113.118.39 - [B@1996cd68
        -VIKING:2620:9b:0:0:0:0:1971:7627 - [B@3339ad8e
        -VIKING:fe80:0:0:0:51bf:994d:4656:8486%eth5 - [B@555590
Bluetooth Device (Personal Area Network)
        -fe80:0:0:0:4c56:8009:2bca:e16b%eth6:fe80:0:0:0:4c56:8009:2bca:e16b%eth6 - [B@3c679bde
Bluetooth Device (RFCOMM Protocol TDI)
Intel(R) Ethernet Connection (2) I218-V
        -fe80:0:0:0:4093:d169:536c:7c7c%eth7:fe80:0:0:0:4093:d169:536c:7c7c%eth7 - [B@16b4a017
Microsoft Wi-Fi Direct Virtual Adapter
        -fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1:fe80:0:0:0:103e:cdf0:c0ac:1751%wlan1 - [B@8807e25
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0000
VirtualBox Host-Only Ethernet Adapter-WFP Native MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0001
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0002
VirtualBox Host-Only Ethernet Adapter-VirtualBox NDIS Light-Weight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0003
VirtualBox Host-Only Ethernet Adapter-QoS Packet Scheduler-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0004
VirtualBox Host-Only Ethernet Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
VirtualBox Host-Only Ethernet Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0000
Intel(R) Ethernet Connection (2) I218-V-WFP Native MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0001
Intel(R) Ethernet Connection (2) I218-V-Shrew Soft Lightweight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0002
Intel(R) Ethernet Connection (2) I218-V-VirtualBox NDIS Light-Weight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0003
Intel(R) Ethernet Connection (2) I218-V-QoS Packet Scheduler-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0004
Intel(R) Ethernet Connection (2) I218-V-WFP 802.3 MAC Layer LightWeight Filter-0000
Intel(R) Ethernet Connection (2) I218-V-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-WFP Native MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-Virtual WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-Native WiFi Filter Driver-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Broadcom 802.11ac Network Adapter-Shrew Soft Lightweight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Broadcom 802.11ac Network Adapter-VirtualBox NDIS Light-Weight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Broadcom 802.11ac Network Adapter-QoS Packet Scheduler-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0006
Broadcom 802.11ac Network Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Broadcom 802.11ac Network Adapter-HHD Software NDIS 6.0 Filter Driver-0007
Microsoft Wi-Fi Direct Virtual Adapter-WFP Native MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-Native WiFi Filter Driver-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0002
Microsoft Wi-Fi Direct Virtual Adapter-Shrew Soft Lightweight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0003
Microsoft Wi-Fi Direct Virtual Adapter-VirtualBox NDIS Light-Weight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0004
Microsoft Wi-Fi Direct Virtual Adapter-QoS Packet Scheduler-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0005
Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000
Microsoft Wi-Fi Direct Virtual Adapter-HHD Software NDIS 6.0 Filter Driver-0006

Para meu uso, estou configurando um servidor Upnp, que ajudou a entender o 'padrão' que eu estava procurando. Alguns dos objetos retornados são adaptadores Ethernet, adaptadores de rede, adaptadores de rede virtual, drivers e adaptadores de cliente VPN. Nem tudo tem um endereço também. Então, você deve pular objetos de interface que não o fazem.

Você também pode adicionar isso ao loop para o atual NetworkInterface i

while(interfaces.hasMoreElements()){
    Enumeration<InetAddress> addresses = i.getInetAddresses();
    System.out.println(i.getDisplayName());
    System.out.println("\t- name:" + i.getName());
    System.out.println("\t- idx:" + i.getIndex());
    System.out.println("\t- max trans unit (MTU):" + i.getMTU());
    System.out.println("\t- is loopback:" + i.isLoopback());
    System.out.println("\t- is PPP:" + i.isPointToPoint());
    System.out.println("\t- isUp:" + i.isUp());
    System.out.println("\t- isVirtual:" + i.isVirtual());
    System.out.println("\t- supportsMulticast:" + i.supportsMulticast());
}

E você verá informações em sua saída assim:

Software Loopback Interface 1
    - name:lo
    - idx:1
    - max trans unit (MTU):-1
    - is loopback:true
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [127.0.0.1(VIKING-192.168.56.1)]127.0.0.1:127.0.0.1 - [B@19e1023e
        -ADRESS: [0:0:0:0:0:0:0:1(VIKING-192.168.56.1)]0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:1 - [B@7cef4e59
Broadcom 802.11ac Network Adapter
    - name:wlan0
    - idx:2
    - max trans unit (MTU):1500
    - is loopback:false
    - is PPP:false
    - isUp:true
    - isVirtual:false
    - supportsMulticast:true
        -ADRESS: [VIKING.monkeybrains.net(VIKING-192.168.56.1)]VIKING.monkeybrains.net:192.168.1.142 - [B@64b8f8f4
        -ADRESS: [fe80:0:0:0:81fa:31d:21c9:85cd%wlan0(VIKING-192.168.56.1)]fe80:0:0:0:81fa:31d:21c9:85cd%wlan0:fe80:0:0:0:81fa:31d:21c9:85cd%wlan0 - [B@2db0f6b2
Microsoft Kernel Debug Network Adapter
    - name:eth0
    - idx:3
    - max trans unit (MTU):-1
    - is loopback:false
    - is PPP:false
    - isUp:false
    - isVirtual:false
    - supportsMulticast:true
Decodificado
fonte
3

Use InetAddress.getLocalHost () para obter o endereço local

import java.net.InetAddress;

try {
  InetAddress addr = InetAddress.getLocalHost();            
  System.out.println(addr.getHostAddress());
} catch (UnknownHostException e) {
}
vdeantoni
fonte
Meu PPP Connection endereço IP é: 117.204.44.192 Mas os retornos acima de mim 192.168.1.2
sasidhar
Você precisa rastrear todas as instâncias do InetAddress disponíveis e descobrir qual é a correta.
Decodificado
1
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class IpAddress {

NetworkInterface ifcfg;
Enumeration<InetAddress> addresses;
String address;

public String getIpAddress(String host) {
    try {
        ifcfg = NetworkInterface.getByName(host);
        addresses = ifcfg.getInetAddresses();
        while (addresses.hasMoreElements()) {
            address = addresses.nextElement().toString();
            address = address.replace("/", "");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ifcfg.toString();
}
}
twatson0990
fonte
1

Uma abordagem bastante simplista que parece estar funcionando ...

String getPublicIPv4() throws UnknownHostException, SocketException{
    Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
    String ipToReturn = null;
    while(e.hasMoreElements())
    {
        NetworkInterface n = (NetworkInterface) e.nextElement();
        Enumeration<InetAddress> ee = n.getInetAddresses();
        while (ee.hasMoreElements())
        {
            InetAddress i = (InetAddress) ee.nextElement();
            String currentAddress = i.getHostAddress();
            logger.trace("IP address "+currentAddress+ " found");
            if(!i.isSiteLocalAddress()&&!i.isLoopbackAddress() && validate(currentAddress)){
                ipToReturn = currentAddress;    
            }else{
                System.out.println("Address not validated as public IPv4");
            }

        }
    }

    return ipToReturn;
}

private static final Pattern IPv4RegexPattern = Pattern.compile(
        "^(([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");

public static boolean validate(final String ip) {
    return IPv4RegexPattern.matcher(ip).matches();
}
Pantelis Natsiavas
fonte
1

Isso obtém o endereço IP da sua rede se a sua máquina fizer parte de uma rede

try {
    System.out.println(InetAddress.getLocalHost().getHostAddress());
} catch (UnknownHostException e) {
    e.printStackTrace();
}
code511788465541441
fonte
0

Normalmente, quando tento encontrar meu endereço IP público como cmyip.com ou www.iplocation.net , uso desta maneira:

public static String myPublicIp() {

    /*nslookup myip.opendns.com resolver1.opendns.com*/
    String ipAdressDns  = "";
    try {
        String command = "nslookup myip.opendns.com resolver1.opendns.com";
        Process proc = Runtime.getRuntime().exec(command);

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String s;
        while ((s = stdInput.readLine()) != null) {
            ipAdressDns  += s + "\n";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return ipAdressDns ;
}
YCF_L
fonte
0

Desde o meu sistema (como tantos outros sistemas) tinha várias interfaces de rede. InetAddress.getLocalHost()ou Inet4Address.getLocalHost()simplesmente devolveu um que eu não desejava. Portanto, eu tive que usar essa abordagem ingênua.

InetAddress[] allAddresses = Inet4Address.getAllByName("YourComputerHostName");
        InetAddress desiredAddress;
        //In order to find the desired Ip to be routed by other modules (WiFi adapter)
        for (InetAddress address :
                allAddresses) {
            if (address.getHostAddress().startsWith("192.168.2")) {
                desiredAddress = address;
            }
        }
// Use the desired address for whatever purpose.

Apenas tome cuidado para que, nessa abordagem, eu já soubesse que meu endereço IP desejado está na 192.168.2sub-rede.

SepJaPro2.4
fonte
-1
public static String getIpAddress() {

    String ipAddress = null;

    try {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();

        while (networkInterfaces.hasMoreElements()) {

            NetworkInterface networkInterface = networkInterfaces.nextElement();

            byte[] hardwareAddress = networkInterface.getHardwareAddress();
            if (null == hardwareAddress || 0 == hardwareAddress.length || (0 == hardwareAddress[0] && 0 == hardwareAddress[1] && 0 == hardwareAddress[2])) continue;

            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();

            if (inetAddresses.hasMoreElements()) ipAddress = inetAddresses.nextElement().toString();

            break;
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }

    return ipAddress;
}
Maxple
fonte
adicione algumas explicações sobre o que seu código faz.
precisa saber é o seguinte