2009-12-10 135 views
71

我在不同的操作系统上测试我们的服务器应用程序(编写的Java),并认为OpenSolaris(2008.11)由于良好的Java集成将是最麻烦的。事实证明我错了,我结束了一个UnknownHostException异常InetAddress.getLocalHost()抛出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有什么特别的东西我不知道?

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

回答

105

在优良传统,我可以再次回答我的问题:

似乎InetAddress.getLocalHost()忽略的/etc/resolv.conf但只着眼于/ etc/hosts文件(如果我没有指定任何东西除了本地主机)。将IP和主机名添加到该文件可解决问题,并且异常消失。


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

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

步骤:

  • 打开/ 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代码...你的工作就完成了。
+1

如果在尝试写入主机文件时遇到权限问题,此处的说明将有所帮助:http://decoding.wordpress.com/2009/04/06/how-to-edit-the-hosts-file -in-mac-os-x-leopard/ – septerr 2012-08-06 19:01:43

+3

在OS X和java 7中也有一个错误,详细信息和解决方法在这里https://groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo – 2014-06-16 23:22:53

+11

设置'127.0.0.1 localhost '对我来说已经足够了 – 2014-09-05 11:26:47

4

主机查找在Solaris上使用​​所以这取决于什么“主人:”行表示,它确定/etc/hosts,NIS,DNS和/或LDAP应征询。

如果你只使用主机和DNS,你应该有这样的​​:

hosts: files dns

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

getent hosts desvearth01
+0

非常有帮助!这花了我几天的时间才明白。 – Tilo 2012-11-26 23:08:24

0

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

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

1

如果你看到这条消息比你需要设置的主机名hostname superhost.domainCOMMAND

之后,检查哪个/etc/hosts文件包含像这样的字符串127.0.0.1 localhost

此外,检查命令uname -a回报是这样的:

的Linux superhost.domain 2.6.38-8服务器#42 Ubuntu的SMP周一4月11日3时49分04秒UTC 2011 x86_64的x86_64 x86_64 GNU/Linux

不喜欢这个!!!!

的Linux (无) 2.6.38-8服务器#42的Ubuntu SMP星期一年04月11 3点49分04秒UTC 2011 x86_64的x86_64的x86_64的GNU/Linux的

2

结帐的/ etc /主机名然后把你的主机名到主机文件。

2

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

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

此错误显示,当我改变了工作站名称,并试图开始的Glassfish 2.您还必须重命名为/ etc/hosts中的条目,这样的事情:

127.0.0.1  localhost 
127.0.1.1  MyNewName 
+0

这对我有用 - 谢谢! – 2017-07-14 21:49:34

3

在我的亚马逊实例我有同样的问题,有默认的DNS配置问题。因此,要解决这个问题,我做了这些步骤 -

让你的主机名

$hostname 
ip-10-122-16-169 

平到主机

$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