InetAddress.getLocalHost () menampilkan UnknownHostException

88

Saya menguji aplikasi server kami (Java tertulis) pada sistem operasi yang berbeda dan berpikir bahwa OpenSolaris (2008.11) akan menjadi yang paling tidak merepotkan karena integrasi Java yang bagus. Ternyata saya salah, karena saya berakhir dengan UnknownHostException

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

Outputnya adalah:

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

Namun, nslookup desvearth01mengembalikan alamat IP yang benar, dan nslookup localhostmengembalikan 127.0.0.1seperti yang diharapkan. Selain itu, kode yang sama berfungsi dengan sempurna di FreeBSD. Apakah ada sesuatu yang istimewa pada OpenSolaris yang tidak saya sadari?

Setiap petunjuk dihargai, terima kasih.

jhwist
sumber

Jawaban:

120

Dalam tradisi yang baik, saya dapat menjawab pertanyaan saya sendiri sekali lagi:

Tampaknya InetAddress.getLocalHost()mengabaikan /etc/resolv.conf, tetapi hanya melihat /etc/hostsfile (di mana saya tidak menentukan apa pun selain itu localhost). Menambahkan IP dan nama host ke file ini memecahkan masalah dan pengecualian hilang.


Jawaban lain hampir benar dan saya mendapat petunjuk dari atas dan masalah saya teratasi ... Terima kasih.

Tetapi untuk meningkatkan ini, saya menambahkan perubahan langkah demi langkah, sehingga akan berguna bahkan untuk pengguna yang naif.

Langkah:

  • Terbuka /etc/hosts, entri mungkin terlihat seperti di bawah ini.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • Anda perlu menambahkan satu baris lagi di atasnya oleh editor seperti viatau gedit(misalnya <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Sekarang, file keseluruhan mungkin terlihat seperti ini:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Simpan saja dan jalankan lagi kode Java Anda ... pekerjaan Anda selesai.
jhwist
sumber
1
Jika Anda mengalami masalah izin saat mencoba menulis ke file host, petunjuk di sini akan membantu: decoding.wordpress.com/2009/04/06/…
septerr
3
Ada juga bug di OS X dan java 7, detail dan solusinya di sini groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood
12
Pengaturan 127.0.0.1 localhost <hostname>sudah cukup bagi saya
Marius Soutier
Menemukan ini terlambat. Mengkodekan solusi NetworkInterface.getNetworkInterfaces () sebagai gantinya.
ctpenrose
4
Untuk mendapatkan nama host Anda, Anda dapat menggunakan hostnameperintah dari terminal.
Gray
8

Saya gunakan NetworkInterface.getNetworkInterfaces()sebagai penyangga saat InetAddress.getLocalHost()melempar UnknownHostException. Berikut kodenya (tanpa kecuali penanganan untuk kejelasan).

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

Jawaban lain mengedit /etc/hostsfile. Ini rawan kesalahan, rapuh, mungkin memerlukan akses root dan tidak akan berfungsi di semua OS.

Nathan
sumber
6

Pada contoh amazon saya, saya mengalami masalah yang sama, ada masalah konfigurasi DNS default. Jadi untuk memperbaiki masalah saya telah melakukan langkah-langkah ini -

dapatkan nama host Anda

$hostname
ip-10-122-16-169

ping ke nama host

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

cat / etc / hosts , Anda akan mendapatkan sesuatu seperti

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

sekarang Anda hanya perlu menambahkan nama host Anda di akhir baris pertama, jadi ketika Anda menambahkannya akan terlihat seperti

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

sekarang Anda siap untuk pergi, untuk memeriksa ping lagi nama host yang sama

$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
sumber
bekerja untuk contoh ec2, terima kasih
baybatu
4

Pencarian host di Solaris menggunakan /etc/nsswitch.confjadi tergantung pada apa yang dikatakan baris 'hosts:' itu menentukan apakah /etc/hosts, NIS, DNS dan / atau LDAP harus dikonsultasikan.

Jika Anda hanya menggunakan host dan DNS, Anda harus memiliki ini di /etc/nsswitch.conf:

host: file dns

Alasan nslookup desvearth01berhasil adalah karena nslookupperintah berkonsultasi secara langsung /etc/resolv.conf. Jika Anda ingin melakukan pengujian baris perintah yang lebih baik, gunakan perintah:

getent host desvearth01
Martin
sumber
4

Kesalahan ini muncul ketika saya mengubah nama workstation dan mencoba memulai Glassfish 2. Anda juga harus mengganti nama entri di / etc / hosts, seperti ini:

127.0.0.1       localhost
127.0.1.1       MyNewName
Jimmy
sumber
2

Checkout / etc / hostname lalu masukkan nama host Anda ke file host.

pengguna4877680
sumber
1

Jika Anda melihat pesan ini daripada Anda perlu mengatur nama host DENGAN hostname superhost.domain PERINTAH !

Setelah ini, periksa /etc/hostsfile mana yang berisi string seperti ini 127.0.0.1 localhost.

Juga, periksa bahwa perintah uname -amengembalikan sesuatu seperti ini:

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

TIDAK SEPERTI INI!!!!

Linux (tidak ada) 2.6.38-8-server # 42-Ubuntu SMP Sen 11 Apr 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

Pavel
sumber
0

Saya juga mengalami masalah seputar ini. Saya perlu melakukan pengujian lebih lanjut, tetapi sepertinya NetworkInterface.getNetworkInterfaces()bisa lebih andal. Saya pikir ini tidak melakukan pencarian, tetapi hanya mengambil IP.

Saya menggunakannya sebagai 'terbaik berikutnya' saat getLocalHost()gagal.

Jon
sumber