89

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

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

4

9 回答 9

123

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

似乎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 代码……您的工作就完成了。
于 2009-12-10T15:57:19.810 回答
10

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 访问权限,并且不适用于所有操作系统。

于 2015-09-16T18:00:16.123 回答
6

在我的亚马逊实例上,我遇到了同样的问题,存在默认 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
于 2017-06-14T08:59:38.347 回答
4

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

如果你只使用主机和 DNS,你应该有这个/etc/nsswitch.conf

主机:文件 dns

之所以nslookup desvearth01有效,是因为该nslookup命令直接咨询/etc/resolv.conf. 如果你想做一个更好的命令行测试,使用命令:

getent 主机 desvearth01
于 2010-05-20T13:56:41.573 回答
4

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

127.0.0.1       localhost
127.0.1.1       MyNewName
于 2015-09-22T14:20:19.497 回答
2

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

于 2015-05-08T05:41:51.503 回答
1

如果您看到此消息,则需要使用命令设置主机 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

于 2012-07-27T05:55:53.890 回答
0

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

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

于 2010-07-06T17:08:15.747 回答
0

另一个选项在这篇文章中(实际上,您的主机名的 /etc/sysconfig/network 文件中有什么...通过将其更改为 FQDN 名称可以解决此问题)。

java getLocalHost() UnknownHostException /etc/hosts 文件与 linux api 不同?

于 2012-08-28T13:36:04.753 回答