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