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に特別なものはありますか?

どんなヒントもありがたいです、ありがとう。

回答:


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
    
  • viまたはgedit(例<your-machine-ip> <your-machine-name> localhost)のようなエディタで、この上にもう1行追加する必要があります。

     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
hostsファイルへの書き込みしようとしたときに権限の問題が発生した場合は、ここでの説明は役立ちます:decoding.wordpress.com/2009/04/06/...
septerr


12
設定127.0.0.1 localhost <hostname>は私にとって十分でした
Marius Soutier 2014

これは遅すぎます。代わりに、NetworkInterface.getNetworkInterfaces()ソリューションをコーディングしました。
ctpenrose 2015年

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アクセスが必要な場合があり、すべてのOSで機能するとは限りません。


5

私の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

Solarisでのホストルックアップは/etc/nsswitch.conf、「hosts:」行の内容に応じて、/etc/hosts、NIS、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をチェックアウトしてから、hostnameをhostsファイルに配置します。


1

このメッセージが表示された場合、あなたはセットのホスト名必要以上WITH 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-サーバー#42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux



0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.