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 ServerSocket
e 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 ServerSocket
nó de inicialização, mas isso não funcionou.
- Preciso que o cliente registre seu IP PPP, se disponível;
- Caso contrário, o IP da LAN, se disponível;
- 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 NetworkInterface
s, 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
Respostas:
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.8
não é necessário para estar acessível.Connect
em 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:
fonte
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?
NetworkInterface.getNetworkInterfaces()
para obter todas as interfaces de rede conhecidas no host e iterar nos endereços de cada NI.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?)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".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.
fonte
use getLocalHost().getHostAddress()
publicar algo, poderá ver0.0.0.0
ao procurar em outro computador na rede. Isto é explicado aqui Isto é o que aconteceu comigo quando eu estava usando Gazebo em dois computadoresA 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):
fonte
Você pode usar a classe InetAddress do java para esse fim.
Saída para o meu sistema =
IP of my system is := 10.100.98.228
retorna getHostAddress ()
OU você também pode fazer
Saída =
IP of my system is := RanRag-PC/10.100.98.228
fonte
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 é olocalhost
próprio, porque localhost é apenas um loopback.Abaixo está mostrando como descobrir seu endereço local quando você está se comunicando com
google.com
:fonte
Exemplo em scala (útil no arquivo sbt):
fonte
EDIT 1: O código atualizado, desde o link anterior, não existe mais
VERSÃO REAL: Isso parou de funcionar
Esperamos que este trecho possa ajudá-lo a conseguir isso:
fonte
whatismyip.com
inativo 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 porwhatismyip.com
, não necessariamente o endereço IP da máquina que você está usando.primeiro, importe a classe
em aula
fonte
Você pode usar a
java.net.InetAddress
API. Tente o seguinte:fonte
fonte
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.
Quando executo esse código, na verdade, recebo uma impressão assim:
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
E você verá informações em sua saída assim:
fonte
Use InetAddress.getLocalHost () para obter o endereço local
fonte
fonte
Uma abordagem bastante simplista que parece estar funcionando ...
fonte
Isso obtém o endereço IP da sua rede se a sua máquina fizer parte de uma rede
fonte
Normalmente, quando tento encontrar meu endereço IP público como cmyip.com ou www.iplocation.net , uso desta maneira:
fonte
Desde o meu sistema (como tantos outros sistemas) tinha várias interfaces de rede.
InetAddress.getLocalHost()
ouInet4Address.getLocalHost()
simplesmente devolveu um que eu não desejava. Portanto, eu tive que usar essa abordagem ingênua.Apenas tome cuidado para que, nessa abordagem, eu já soubesse que meu endereço IP desejado está na
192.168.2
sub-rede.fonte
fonte