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()失败时,我将它用作“下一个最佳”。