InetAddress.getLocalHost()抛出UnknownHostException

jhw*_*ist 82 java freebsd opensolaris

我正在不同的操作系统上测试我们的服务器应用程序(编写的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();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

java.net.UnknownHostException: desvearth01: desvearth01
    at java.net.InetAddress.getLocalHost(InetAddress.java:1353)
Run Code Online (Sandbox Code Playgroud)

但是,nslookup desvearth01返回正确的IP地址,并按预期nslookup localhost返回127.0.0.1.此外,相同的代码在FreeBSD上完美运行.我不知道OpenSolaris有什么特别之处吗?

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

jhw*_*ist 116

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

似乎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
    
    Run Code Online (Sandbox Code Playgroud)
  • 你需要在vi或gedit之类的任何编辑器上再添加一行. <your-machine-ip> <your-machine-name> localhost例如.

    192.168.1.73 my_foo localhost
    
    Run Code Online (Sandbox Code Playgroud)

现在,整个文件可能如下所示:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
Run Code Online (Sandbox Code Playgroud)
  • 只需保存它并再次运行您的java ...代码即可完成您的工作.

  • 设置`127.0.0.1 localhost <hostname>`对我来说已经足够了 (12认同)
  • 要获取主机名,可以使用终端的`hostname`命令. (4认同)
  • OS X和java 7中也存在一个错误,详细信息和解决方法https://groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo (3认同)

Nat*_*han 6

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());
  }
}
Run Code Online (Sandbox Code Playgroud)


ank*_*hen 6

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

获取您的主机名

$hostname
ip-10-122-16-169
Run Code Online (Sandbox Code Playgroud)

ping 主机名

$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169
Run Code Online (Sandbox Code Playgroud)

cat /etc/hosts文件,你会得到类似的东西

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6
Run Code Online (Sandbox Code Playgroud)

现在你只需要在第一行的末尾附加你的主机名,所以当你附加时它看起来像

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1         localhost6 localhost6.localdomain6
Run Code Online (Sandbox Code Playgroud)

现在你准备好了,再次检查 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
Run Code Online (Sandbox Code Playgroud)