InetAddress.getLocalHost()抛出UnknownHostException

时间:2009-12-10 15:02:10

标签: java freebsd opensolaris

我正在不同的操作系统上测试我们的服务器应用程序(编写的Java),并认为OpenSolaris(2008.11)由于良好的Java集成而成为最不麻烦的。事实证明我错了,因为我最终得到了一个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有什么特别之处吗?

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

9 个答案:

答案 0 :(得分:112)

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

InetAddress.getLocalHost()似乎忽略了/etc/resolv.conf,但只查看/ etc / hosts文件(除了localhost之外我没有指定任何内容)。将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 :(得分:4)

Solaris上的主机查找使用/etc/nsswitch.conf,因此根据'hosts:'行说明它确定是否应咨询/etc/hosts,NIS,DNS和/或LDAP。

如果您只使用主机和DNS,则应在/etc/nsswitch.conf

中使用
hosts: files dns

nslookup desvearth01的作用原因是nslookup命令直接咨询/etc/resolv.conf。如果要进行更好的命令行测试,请使用以下命令:

getent hosts desvearth01

答案 2 :(得分:4)

我使用NetworkInterface.getNetworkInterfaces()作为InetAddress.getLocalHost()投出UnknownHostException时的后退。这是代码(为清晰起见,无异常处理)。

Intent callIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:"+"999999");
            startActivity(callIntent);
        } 

答案 3 :(得分:4)

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

127.0.0.1       localhost
127.0.1.1       MyNewName

答案 4 :(得分:4)

在我的亚马逊实例上我遇到了同样的问题,存在默认的DNS配置问题。所以要解决这个问题,我已经完成了这些步骤 -

  

获取您的主机名

$hostname
ip-10-122-16-169
  

ping到主机名

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

cat / 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

答案 5 :(得分:2)

Checkout / etc / hostname 然后将您的主机名放入hosts文件。

答案 6 :(得分:1)

如果您看到此消息,则需要设置主机名 WITH hostname superhost.domain 命令

在此之后,检查哪个/etc/hosts文件包含此127.0.0.1 localhost字符串。

另外,检查命令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 (无) 2.6.38-8-server#42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

答案 7 :(得分:0)

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

getLocalHost()失败时,我将其用作“次佳”。

答案 8 :(得分:0)

另一个选项是在这篇文章中(事实上,您的/ etc / sysconfig / network文件中的主机名是什么...通过将其更改为FQDN名称来修复此问题。)

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