InetAddress.getLocalHost()引发UnknownHostException


87

我正在不同的操作系统上测试我们的服务器应用程序(用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有什么特别的地方吗?

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

Answers:


119

按照传统,我可以再次回答自己的问题:

似乎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
    
  • 您需要像vigedit(例如<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
如果您在尝试写入主机文件时遇到权限问题,则此处的说明将有所帮助:解码
.wordpress.com / 2009/04/06 /…

3
OS X和Java 7中也存在一个错误,此处的细节和解决方法groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
Mark Lakewood

12
设置127.0.0.1 localhost <hostname>对我来说已经足够了
Marius Soutier 2014年

发现这个为时已晚。而是编写了NetworkInterface.getNetworkInterfaces()解决方案。
ctpenrose

4
要获取主机名,可以hostname在终端上使用命令。
灰色

8

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

其他答案将编辑/etc/hosts文件。这是容易出错的,易碎的,可能需要root用户访问权限,并且无法在所有操作系统上使用。


5

在我的亚马逊实例上,我遇到了同样的问题,存在默认的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

4

Solaris上的主机查找使用的方式/etc/nsswitch.conf取决于'hosts:'行所说的内容,它确定是否应查询/etc/hostsNIS,DNS和/或LDAP。

如果仅使用主机和DNS,则应在以下位置使用它/etc/nsswitch.conf

主机:文件dns

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

getent主机desvearth01

4

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

127.0.0.1       localhost
127.0.1.1       MyNewName

2

检出/ etc / hostname,然后将您的主机放入hosts文件。


1

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

之后,检查哪个/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



0

我也有与此有关的问题。我需要做进一步的测试,但是看起来 NetworkInterface.getNetworkInterfaces()可以更可靠。我认为这不执行查找,而只是获取IP。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.