InetAddress.getLocalHost () UnknownHostException oluşturur


88

Sunucu uygulamamızı (yazılı Java) farklı işletim sistemlerinde test ediyorum ve güzel Java entegrasyonu nedeniyle OpenSolaris'in (2008.11) en az sorun yaratacağını düşündüm. Bir UnknownHostException ile sonuçlandığım için yanıldığım anlaşılıyor

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

Çıktı:

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

Ancak nslookup desvearth01doğru IP adresini nslookup localhostdöndürür 127.0.0.1ve beklendiği gibi geri döner . Ayrıca, aynı kod FreeBSD'de mükemmel çalışır. OpenSolaris'te farkında olmadığım özel bir şey var mı?

Herhangi bir ipucu takdir edildi, teşekkürler.

Yanıtlar:


120

İyi bir gelenekte kendi sorumu bir kez daha cevaplayabilirim:

Görünüşe göre bu, InetAddress.getLocalHost()yok sayıyor /etc/resolv.conf, ancak yalnızca /etc/hostsdosyaya bakıyor (dışında hiçbir şey belirtmediğim yerde localhost). IP ve ana bilgisayar adını bu dosyaya eklemek sorunu çözer ve istisna ortadan kalkar.


Başka bir cevap neredeyse doğru ve yukarıdan bir ipucu aldım ve sorunum çözüldü ... Teşekkürler.

Ancak bunu iyileştirmek için, adım adım değişiklikler ekliyorum, böylece tecrübesiz kullanıcılar için bile yararlı olacaktır.

Adımlar:

  • Açın /etc/hosts, girişler aşağıdaki gibi görünebilir.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Sen gibi herhangi editör tarafından bunun üzerinde bir daha satır eklemek gerekir viveya gedit(örneğin <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Şimdi, genel dosya şöyle görünebilir:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Sadece kaydedin ve Java kodunuzu tekrar çalıştırın ... işiniz bitti.

1
Hosts dosyasına yazma çalışırken izin sorunla karşılaşırsak burada talimatlar yardımcı olacaktır: decoding.wordpress.com/2009/04/06/...
septerr

3
OS X ve java 7'de de bir hata var, ayrıntılar ve çözüm burada groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood

12
Ayar 127.0.0.1 localhost <hostname>benim için yeterliydi
Marius Soutier

Bunu çok geç buldum. Bunun yerine NetworkInterface.getNetworkInterfaces () çözümünü kodladı.
ctpenrose

4
Ana bilgisayar adınızı almak için hostname, terminalden komutu kullanabilirsiniz .
Gray

8

Ben attığı NetworkInterface.getNetworkInterfaces()zaman için bir geri dönüş olarak kullanıyorum . İşte kod (açıklık için istisnasız).InetAddress.getLocalHost()UnknownHostException

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

Diğer cevaplar /etc/hostsdosyayı düzenler . Bu hataya meyillidir, kırılgandır, kök erişimi gerektirebilir ve tüm işletim sistemlerinde çalışmayabilir.


6

Amazon örneğimde aynı sorunu yaşıyordum, varsayılan DNS yapılandırma sorunu vardı. Bu yüzden sorunu çözmek için şu adımları uyguladım -

ana bilgisayar adını al

$hostname
ip-10-122-16-169

ana bilgisayar adına ping

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

cat / etc / hosts dosyasında aşağıdaki gibi bir şey elde edeceksiniz:

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

şimdi ana bilgisayar adınızı ilk satırın sonuna eklemeniz gerekiyor, böylece eklediğinizde

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

şimdi aynı ana bilgisayar adını tekrar ping kontrol etmek için gitmeye hazırsınız

$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

bir ec2 örneği için çalıştı, teşekkürler
baybatu

4

Solaris'teki ana bilgisayar aramaları /etc/nsswitch.conf, 'ana bilgisayarlar:' satırının söylediği şeye bağlı olarak /etc/hosts, NIS, DNS ve / veya LDAP'ye başvurulup başvurulmayacağını belirler.

Yalnızca ana bilgisayarlar ve DNS kullanıyorsanız, aşağıdakilere sahip olmalısınız /etc/nsswitch.conf:

ana bilgisayarlar: dosyalar dns

Bunun nedeni nslookup desvearth01, nslookupkomutun doğrudan danışmasıdır /etc/resolv.conf. Daha iyi bir komut satırı testi yapmak istiyorsanız, şu komutu kullanın:

getent hosts desvearth01

4

Bu hatalar, iş istasyonunun adını değiştirdiğimde ve Glassfish 2'yi başlatmayı denediğimde ortaya çıkıyor. Ayrıca, / etc / hosts'daki girdiyi şu şekilde yeniden adlandırmanız gerekir:

127.0.0.1       localhost
127.0.1.1       MyNewName


1

Bu mesajı görüyorsanız size oluşturma hostname gerekenden daha İLE hostname superhost.domain COMMAND !

Bundan sonra, hangi /etc/hostsdosyanın bunun gibi dizge içerdiğini kontrol edin 127.0.0.1 localhost.

Ayrıca, komutun şöyle bir uname -aşey döndürdüğünü kontrol edin :

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

BÖYLE DEĞİL!!!!

Linux (yok) 2.6.38-8-server # 42-Ubuntu SMP Pzt 11 Nis 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux



0

Ben de bununla ilgili sorunlar yaşıyorum. Daha fazla test yapmam gerekiyor ama NetworkInterface.getNetworkInterfaces()daha güvenilir gibi görünüyor . Bunun aramayı yapmadığını, sadece IP'yi aldığını düşünüyorum.

getLocalHost()Başarısız olduğunda 'bir sonraki en iyi' olarak kullanıyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.