web-dev-qa-db-ja.com

InetAddress.getLocalHost()がUnknownHostExceptionをスローします

さまざまなオペレーティングシステムでサーバーアプリケーション(Javaを記述)をテストしており、OpenSolaris(2008.11)はNice 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に気付いていないことはありますか?

ヒントをいただければ幸いです。

79
jhwist

良い伝統では、私自身の質問にもう一度答えることができます:

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などのエディターで、この行を1行追加する必要があります。 <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を再実行するだけで、作業が完了したコードを作成します。
113
jhwist

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

Solarisでのホストルックアップは/etc/nsswitch.confを使用するため、 'hosts:'行の内容に応じて、/etc/hosts、NIS、DNS、および/またはLDAPを調べる必要があるかどうかを判断します。

ホストとDNSのみを使用する場合は、/etc/nsswitch.confにこれがあるはずです。

ホスト:ファイルdns

nslookup desvearth01が機能する理由は、nslookupコマンドが/etc/resolv.confを直接参照するためです。より良いコマンドラインテストを実行する場合は、次のコマンドを使用します。

getentホストdesvearth01
4
Martin

このエラーは、ワークステーション名を変更してGlassfish 2を起動しようとしたときに表示されます。/etc/hostsのエントリの名前も次のように変更する必要があります。

127.0.0.1       localhost
127.0.1.1       MyNewName
4
Jimmy

Amazonインスタンスで同じ問題が発生していましたが、デフォルトの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
ankit.vishen

チェックアウト/ etc/hostnameその後、ホスト名をhostsファイルに追加します。

2
user4877680

このメッセージが表示される場合は、ホスト名を設定する必要があります[〜#〜] 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

1
Pavel

私もこの問題を抱えています。さらにテストする必要がありますが、NetworkInterface.getNetworkInterfaces()の方が信頼性が高いようです。これはルックアップを行わず、IPを取得するだけだと思います。

getLocalHost()が失敗したときに、「次善」として使用しています。

0
Jon

別のオプションがこの投稿にあります(実際、ホスト名の/ etc/sysconfig/networkファイルにあるものを... FQDN名に変更することにより、この問題が修正されます)。

Java getLocalHost()UnknownHostException/etc/hostsファイルはlinux apiが異なりますか?

0
Dean Hiller