【问题标题】:InetAddress.getLocalHost() throws UnknownHostExceptionInetAddress.getLocalHost() 抛出 UnknownHostException
【发布时间】:2010-12-25 06:58:12
【问题描述】:

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

感谢任何提示,谢谢。

【问题讨论】:

    标签: java freebsd opensolaris


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      似乎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(例如&lt;your-machine-ip&gt; &lt;your-machine-name&gt; 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 代码...您的工作就完成了。

      【讨论】:

      • 如果您在尝试写入 hosts 文件时遇到权限问题,这里的说明会有所帮助:decoding.wordpress.com/2009/04/06/…
      • OS X 和 java 7 也有一个 bug,详情和解决方法在这里groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
      • 设置 127.0.0.1 localhost &lt;hostname&gt; 对我来说已经足够了
      • 发现这个太晚了。改为编写 NetworkInterface.getNetworkInterfaces() 解决方案。
      • 要获取您的主机名,您可以在终端使用hostname 命令。
      【解决方案3】:

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

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

        127.0.0.1       localhost
        127.0.1.1       MyNewName
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

              主机:文件 dns

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

              getent 主机 desvearth01

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-09-15
                    • 1970-01-01
                    • 2023-03-18
                    • 1970-01-01
                    • 2018-06-20
                    • 2017-07-23
                    • 2011-02-23
                    相关资源
                    最近更新 更多