InetAddress.getLocalHost()抛出UnknownHostException

我在不同的操作系统上testing我们的服务器应用程序(编写的Java),并认为由于良好的Java集成,OpenSolaris(2008.11)将是最麻烦的。 原来我错了,因为我最终得到了一个UnknownHostException

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有什么特别的东西我不知道?

任何提示表示赞赏,谢谢。

在良好的传统中,我可以再次回答我自己的问题:

看起来, InetAddress.getLocalHost()忽略了/etc/resolv.conf,但只查看/ etc / hosts文件(我除了localhost之外没有指定任何东西)。 将IP和主机名添加到该文件解决了这个问题,exception消失了。


上面的答案几乎是正确的,我从上面提示,我的问题得到解决…谢谢。

但为了改善这一点,我正在逐步添加更改,以便对于天真的用户来说也是很有帮助的。

脚步:

  • 打开/ etc / hosts,条目可能如下所示。

     127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 
  • 你需要通过像vi或gedit这样的编辑器来添加更多的行。 <your-machine-ip> <your-machine-name> localhost例如。

     192.168.1.73 my_foo localhost 

现在,整体文件可能如下所示:

 192.168.1.73 my_foo localhost 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 
  • 只需保存并再次运行您的Java代码即可完成工作。

Solaris上的主机查找使用/etc/nsswitch.conf ,这取决于“hosts:”这一行是用来确定是否应该查询/etc/hosts ,NIS,DNS和/或LDAP。

如果你只使用主机和DNS,你应该在/etc/nsswitch.conf有这个:

 主机:文件dns 

nslookup desvearth01工作的原因是因为nslookup命令直接咨询/etc/resolv.conf 。 如果你想做一个更好的命令行testing,使用命令:

  getent主机desvearth01 

当我更改工作站名称并尝试启动Glassfish 2时,会显示此错误。您还必须重命名/ etc / hosts中的条目,如下所示:

 127.0.0.1 localhost 127.0.1.1 MyNewName 

签出/ etc / hostname然后把你的主机名到主机文件。

InetAddress.getLocalHost()抛出UnknownHostException时,我使用NetworkInterface.getNetworkInterfaces()作为回退。 这是代码(为了清晰起见,没有例外处理)。

 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()) // If I want loopback, I would use "localhost" or "127.0.0.1". 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()); } } 

如果你看到这个消息比你需要设置主机名 hostname superhost.domain COMMAND

在此之后,检查哪个/etc/hosts文件包含像这个127.0.0.1 localhost这样的string。

另外,检查命令uname -a返回如下所示:

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

不喜欢这个!

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

在我的亚马逊实例我有同样的问题,有默认的DNSconfiguration问题。 所以要解决这个问题,我已经完成了这些步骤 –

获取主机名

 $hostname ip-10-122-16-169 

ping到主机名

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

/ etc / hosts文件,你会得到类似的东西

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

现在你只需要在第一行的末尾附加你的主机名,所以当你追加它时会看起来像

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

现在你已经准备好去检查再次ping相同的主机名

 $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 

另一种select是在这篇文章中(实际上,你的主机名在/ etc / sysconfig / network文件中是什么…通过将其更改为FQDN名称来解决此问题)。

java getLocalHost()UnknownHostException / etc / hosts文件不同的Linux API?

我也有这个问题。 我需要做进一步的testing,但看起来像NetworkInterface.getNetworkInterfaces()可以更可靠。 我认为这不是查询,而是抓住IP。

getLocalHost()失败时,我将它用作“下一个最佳”。