GetLocalHost()抛出 Unknown HostException

我正在不同的操作系统上测试我们的服务器应用程序(编写的 Java) ,我认为 OpenSolaris (2008.11)是最不麻烦的,因为它有很好的 Java 集成。结果我错了,因为我得到了一个 Unknown HostException

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

输出结果是:

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

但是,nslookup desvearth01返回正确的 IP 地址,而 nslookup localhost按预期返回 127.0.0.1。同样,相同的代码在 FreeBSD 上也能很好地工作。OpenSolaris 有什么特别之处是我不知道的吗?

谢谢你的提示。

106718 次浏览

In good tradition, I can answer my own question once again:

It seems that InetAddress.getLocalHost() ignores the /etc/resolv.conf, but only looks at the /etc/hosts file (where I hadn't specified anything besides localhost). Adding the IP and hostname to this file solves the problem and the exception is gone.


Another answer is almost correct and I got hint from above and my problem get resolved...Thanks.

But to improve this, I am adding steps-by-steps changes, so that it will be helpful for even naive users.

Steps:

  • Open /etc/hosts, the entries might look like below.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • You need to add one more line above of this by any editor like vi or gedit (e.g. <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Now, overall file may look like this:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Just save it and run again your Java code... your work is done.

Host lookups on Solaris uses /etc/nsswitch.conf so depending on what the 'hosts:' line says it determines if /etc/hosts, NIS, DNS and/or LDAP should be consulted.

If you only use hosts and DNS you should have this in /etc/nsswitch.conf:

hosts: files dns

The reason nslookup desvearth01 works is because the nslookup command directly consults /etc/resolv.conf. If you want to do a better command line test, use the command:

getent hosts desvearth01

I am having issues around this as well. I need to do further testing, but it looks like NetworkInterface.getNetworkInterfaces() can be more reliable. I think that this does not do the lookup, but just grabs the IP.

I am using it as the 'next best' when the getLocalHost() fails.

If you see this message than you need set hostname WITH hostname superhost.domain COMMAND!

After this, check which /etc/hosts file contain string like this 127.0.0.1 localhost.

Also, check that command uname -a returns something like this:

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

NOT LIKE THIS!!!!

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

Another option is in this post (in fact, what is in your /etc/sysconfig/network file for your hostname...by changing it to an FQDN name fixes this issue).

java getLocalHost() UnknownHostException /etc/hosts file differs linux api?

Checkout /etc/hostname then put your hostname to hosts file.

I use NetworkInterface.getNetworkInterfaces() as a fall back for when InetAddress.getLocalHost() throws an UnknownHostException. Here's the code (without exception handling for clarity).

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

Other answers edit the /etc/hosts file. This is error prone, brittle, may require root access and won't work on all OS's.

This errors shows up when I changed the workstation name and tried start Glassfish 2. You also must rename the entry at /etc/hosts, something like this:

127.0.0.1       localhost
127.0.1.1       MyNewName

On my amazon instance I was having the same issue, there was default DNS configuration issue. So to fix the issue I had done these steps -

get your host name

$hostname
ip-10-122-16-169

ping to hostname

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

cat /etc/hosts file, you will get something like

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

now you just need to append your host name at the end of the fist line, so when you append it will look like

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

now you're ready to go, to check ping again the same hostname

$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