InetAddress.getLocalHost () lança UnknownHostException

87

Estou testando nosso aplicativo de servidor (escrito em Java) em diferentes sistemas operacionais e pensei que o OpenSolaris (2008.11) seria o menos problemático devido à boa integração Java. Acontece que eu estava errado, pois acabei com um UnknownHostException

try {
  computerName = InetAddress.getLocalHost().getHostName();
  if (computerName.indexOf(".") > -1)
    computerName = computerName.substring(0,
        computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
  e.printStackTrace();
}

O resultado é:

java.net.UnknownHostException: desvearth01: desvearth01
    at java.net.InetAddress.getLocalHost(InetAddress.java:1353)

No entanto, nslookup desvearth01retorna o endereço IP correto e nslookup localhostretorna 127.0.0.1conforme o esperado. Além disso, o mesmo código funciona perfeitamente no FreeBSD. Há algo especial no OpenSolaris que eu não conheço?

Todas as dicas são apreciadas, obrigado.

jhwist
fonte

Respostas:

119

Na boa tradição, posso responder à minha própria pergunta mais uma vez:

Parece que InetAddress.getLocalHost()ignora o /etc/resolv.conf, mas apenas olha para o /etc/hostsarquivo (onde eu não havia especificado nada além localhost). Adicionar o IP e o nome do host a este arquivo resolve o problema e a exceção desaparece.


Outra resposta está quase correta e recebi uma dica de cima e meu problema foi resolvido ... Obrigado.

Mas para melhorar isso, estou adicionando mudanças passo a passo, para que seja útil até mesmo para usuários ingênuos.

Passos:

  • Aberto /etc/hosts, as entradas podem ter a seguinte aparência.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Você precisa adicionar mais uma linha acima deste por qualquer editor como viou gedit(por exemplo <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Agora, o arquivo geral pode ter a seguinte aparência:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Basta salvá-lo e executar novamente seu código Java ... seu trabalho está feito.
jhwist
fonte
1
Se você encontrar problemas de permissão ao tentar gravar no arquivo hosts, as instruções aqui ajudarão: decoding.wordpress.com/2009/04/06/…
septerr
3
Há também um bug no OS X e no java 7, detalhes e solução alternativa aqui groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood
12
O cenário 127.0.0.1 localhost <hostname>era suficiente para mim
Marius Soutier
Achei isso tarde demais. Em vez disso, codificou uma solução NetworkInterface.getNetworkInterfaces ().
ctpenrose
4
Para obter o seu nome de host, você pode usar o hostnamecomando do terminal.
Cinza
8

Eu uso NetworkInterface.getNetworkInterfaces()como uma queda para quando InetAddress.getLocalHost()joga um UnknownHostException. Aqui está o código (sem tratamento de exceção para maior clareza).

Enumeration<NetworkInterface> iterNetwork;
Enumeration<InetAddress> iterAddress;
NetworkInterface network;
InetAddress address;

iterNetwork = NetworkInterface.getNetworkInterfaces();

while (iterNetwork.hasMoreElements())
{
   network = iterNetwork.nextElement();

   if (!network.isUp())
      continue;

   if (network.isLoopback())
      continue;

  iterAddress = network.getInetAddresses();

  while (iterAddress.hasMoreElements())
  {
     address = iterAddress.nextElement();

     if (address.isAnyLocalAddress())
        continue;

     if (address.isLoopbackAddress())
        continue;

     if (address.isMulticastAddress())
        continue;

     return address.getHostAddress();
  }
}

Outras respostas editam o /etc/hostsarquivo. Isso é sujeito a erros, frágil, pode exigir acesso root e não funcionará em todos os sistemas operacionais.

Nathan
fonte
5

Na minha instância do Amazon eu estava tendo o mesmo problema, havia um problema de configuração DNS padrão. Então, para corrigir o problema, executei estas etapas -

pegue seu nome de host

$hostname
ip-10-122-16-169

ping para o nome do host

$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169

arquivo cat / etc / hosts , você obterá algo como

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6

agora você só precisa acrescentar o seu nome de host no final da primeira linha, então quando você acrescentar vai ficar parecido com

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1         localhost6 localhost6.localdomain6

agora você está pronto para ir, para verificar ping novamente o mesmo nome de host

$ping ip-10-122-16-169
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=255 time=0.018 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=255 time=0.024 ms
ankit.vishen
fonte
4

As pesquisas de host no Solaris usam /etc/nsswitch.confisso dependendo do que a linha 'hosts:' diz que determina se /etc/hostsNIS, DNS e / ou LDAP devem ser consultados.

Se você usa apenas hosts e DNS, deve ter isso em /etc/nsswitch.conf:

hosts: arquivos dns

O motivo pelo qual nslookup desvearth01funciona é porque o nslookupcomando consulta diretamente /etc/resolv.conf. Se você quiser fazer um teste de linha de comando melhor, use o comando:

getent hosts desvearth01
Martin
fonte
4

Este erro aparece quando eu alterei o nome da estação de trabalho e tentei iniciar o Glassfish 2. Você também deve renomear a entrada em / etc / hosts, algo assim:

127.0.0.1       localhost
127.0.1.1       MyNewName
Jimmy
fonte
2

Faça checkout de / etc / hostname e coloque seu nome de host no arquivo hosts.

user4877680
fonte
1

Se você vir esta mensagem, precisa definir o nome do host COM hostname superhost.domain COMANDO !

Depois disso, verifique qual /etc/hostsarquivo contém string como esta127.0.0.1 localhost .

Além disso, verifique se o comando uname -aretorna algo assim:

Linux superhost.domain 2.6.38-8-server # 42-Ubuntu SMP Seg 11 de abril 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

ASSIM NÃO!!!!

Linux (nenhum) 2.6.38-8-server # 42-Ubuntu SMP Seg 11 de abril 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Pavel
fonte
0

Também estou tendo problemas com isso. Preciso fazer mais testes, mas parece que NetworkInterface.getNetworkInterfaces()pode ser mais confiável. Acho que isso não faz a consulta, mas apenas pega o IP.

Estou usando-o como o 'próximo melhor' quando o getLocalHost()falha.

Jon
fonte