Java で現在のコンピュータのホスト名を取得するための最良かつ最も移植性の高い方法はどれですか?
Runtime.getRuntime().exec("hostname")
対
InetAddress.getLocalHost().getHostName()
ベストアンサー1
hostname(1)
厳密に言えば、 Unixではまたは のいずれかを呼び出すしかありませんgethostname(2)
。これはコンピュータの名前です。このようにIPアドレスでホスト名を判別しようとすると、
InetAddress.getLocalHost().getHostName()
状況によっては失敗する可能性があります。
- IP アドレスがどの名前にも解決されない可能性があります。DNS 設定、システム設定、またはプロバイダー設定が間違っていることが原因である可能性があります。
- DNS の名前には、CNAME と呼ばれる多くの別名がある場合があります。これらは、名前からアドレスへの一方向でのみ適切に解決できます。逆方向はあいまいです。どれが「正式な」名前でしょうか?
- ホストは多数の異なる IP アドレスを持つことができ、各アドレスは多数の異なる名前を持つことができます。一般的な 2 つのケースは、1 つのイーサネット ポートに複数の「論理」 IP アドレスがあるか、コンピューターに複数のイーサネット ポートがあるというものです。IP を共有するか、異なる IP を持つかは設定可能です。これは「マルチホーム」と呼ばれます。
- DNS 内の 1 つの名前は、複数の IP アドレスに解決できます。また、それらのアドレスがすべて同じコンピューター上に配置されている必要はありません。(使用例: 単純な形式の負荷分散)
- 動的 IP アドレスについては、話す必要すらありません。
また、IP アドレスの名前とホストの名前 (ホスト名) を混同しないでください。比喩を使うとわかりやすくなります。
「ロンドン」という大きな都市 (サーバー) があります。都市の壁の内側では多くのビジネスが行われています。この都市にはいくつかの門 (IP アドレス) があります。各門には名前 (「ノース ゲート」、「リバー ゲート」、「サウサンプトン ゲート」など) がありますが、門の名前は都市の名前ではありません。また、門の名前を使用して都市の名前を推測することはできません。「ノース ゲート」は、1 つの都市だけでなく、大都市の半分をカバーします。しかし、見知らぬ人 (IP パケット) が川沿いを歩いていて、地元の人に尋ねます。「奇妙な住所があります。『リバーゲート、左から 2 番目、3 番目の家』です。手伝ってくれませんか?」地元の人は答えます。「もちろん、正しい道を進んでいます。そのまま進んでください。30 分以内に目的地に到着します。」
これはそれをよく表していると思います。
良いニュースは、実際のホスト名は通常必要ではないということです。ほとんどの場合、このホストの IP アドレスに解決される名前であれば何でもかまいません。(見知らぬ人は Northgate から市内に入るかもしれませんが、親切な地元の人は「2 番目左」の部分を翻訳してくれます。)
残りの特殊なケースでは、この構成設定の決定的なソース、つまり C 関数を使用する必要がありますgethostname(2)
。この関数はプログラムによっても呼び出されますhostname
。