2009-06-30 17 views
20

このコードはローカルIPアドレスを192.xxx.x.xxxとして返すために使用されましたが、現在は127.0.0.1を返しています。なぜ同じコードが別の値を返すのか教えてください。 Linux OSで見たいものがありますか?JavaでIPアドレスが取得されていません

import java.util.*; 
import java.lang.*; 
import java.net.*; 

public class GetOwnIP 
{ 
    public static void main(String args[]) { 
    try{ 
     InetAddress ownIP=InetAddress.getLocalHost(); 
     System.out.println("IP of my system is := "+ownIP.getHostAddress()); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

答えて

30

127.0.0.1はループバックアダプターです。「これは私のIPアドレスは何ですか?」という質問に対する完全な正しい応答です。

問題は、その質問に対するの複数のの正解があることです。

EDIT:getLocalHostためのドキュメントは言う:

セキュリティマネージャが存在する場合、その checkConnectメソッドは、操作があるかどうかを確認するためにその 引数として ローカルホスト名および-1と呼ばれています が許可されています。操作が でない場合、ループバックアドレス を表すInetAddressが返されます。

権限の変更による動作の変更は可能でしょうか?

編集:私はNetworkInterface.getNetworkInterfacesがすべての可能性を列挙するために必要なものだと信じています。ここにいる

import java.net.*; 
import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
     throws Exception // Just for simplicity 
    { 
     for (Enumeration<NetworkInterface> ifaces = 
       NetworkInterface.getNetworkInterfaces(); 
      ifaces.hasMoreElements();) 
     { 
      NetworkInterface iface = ifaces.nextElement(); 
      System.out.println(iface.getName() + ":"); 
      for (Enumeration<InetAddress> addresses = 
        iface.getInetAddresses(); 
       addresses.hasMoreElements();) 
      { 
       InetAddress address = addresses.nextElement(); 
       System.out.println(" " + address); 
      } 
     } 
    } 
} 

(私はEnumeration<T>タイプが直接働くのが、どれだけひどい忘れて!)

:ここでは、仮想アドレスを示していない例ですが、「メイン」のインターフェイスのために働きます今私のラップトップ上の結果:

lo: 
    /127.0.0.1 
eth0: 
    /169.254.148.66 
eth1: 
eth2: 
ppp0: 
    /10.54.251.111 

(私はそれがどの非常機密情報を配っています:)

とは思いません3210

使用するネットワークインターフェイスが分かっている場合は、NetworkInterface.getByName(...)に電話し、そのインターフェイスのアドレスを確認します(上記のコードを参照)。

+1

上記のループでは、NetworkInterface#isLoopback()をチェックするだけでループバックをスキップすることもできます。 – omerkudat

+2

IPアドレスの前にスラッシュがあるのはなぜですか? –

+1

@MatíasInetAddressオブジェクトのJava toStringは、ドット区切りの番号だけを取得するためにaddress.getHostAddress()を使用します。 –

6

InetAddress.getLocalHost()を使用すると、特定のインタフェースを取得する保証はありません。ループバック(127)インタフェースまたは接続されたインタフェースを受け取ることができます。

常に外部インターフェイスを確保するには、java.net.NetworkInterfaceクラスを使用する必要があります。静的なgetByName(String)クラスは、定義された名前( "eth0"など)のインタフェースを提供します。次に、getInetAddresses()関数を使用して、そのインターフェースにバインドされているIPアドレス(単なる1つ)を取得できます。

NetworkInterface ni = NetworkInterface.getByName("eth1"); 
ni.getInetAddresses(); 
2

/etc/hostファイルを確認してください。最初に127.0.0.1を入力すると、これが結果として返されます。

ipアドレスを取得する正しい方法は、NetworkInterface.getNetworkInterfaces()を使用して、それぞれにを実行することです。

-1

127.0.0.1 localhost のように/ etc/hostsに行があるため、 192.xxxが必要です。xxx.xxx localhost

これは、Linuxの設定ファイルを変更しないでください、コードの問題を解決するために非常に悪いことに注意してください。それは正しいことではなく(あなたのLinuxボックスで他のネットワーク認識アプリを壊す危険性がある)だけでなく、他の場所でも動作しません(これらのボックスの管理者も気にしない限り)。

InetAddress.getLocalHost(); javadoc read "....ループバックアドレスを表すInetAddressが返されます。"そのため、getLocalHost()の実装は、あなたのUNIXおよびWINボックスでは正しくありません。 です。ループバックアドレスはほとんどオールウェイズ127.0.0.1

見つからこのコメント 「ホストが複数のIPアドレスを有することができ、他のホストがそれに到達するために異なるアドレスを使用する必要があります。Egが使用する必要があり、イントラネット上のホスト192.168.0.100です他のホストへのソケット接続がある場合は、 Socket.getLocalAddress()を呼び出して、どのローカルアドレスがソケットに使用されているかを知ることができます。

0

NetworkInterface.getNetworkInterfaces()メソッドを使用すると、システムのすべてのネットワークインターフェイスのEnumerationを取得できます。 NetworkInterface各インスタンスの

、あなたは、ネットワークインターフェイスに関連付けられInetAddressインスタンスのすべてのEnumerationを取得するためにgetInetAddresses()メソッドを使用することができます。

最後に、各InetAddressインスタンスでgetHostAddress()メソッドを使用して、IPアドレスをテキスト形式で取得できます。

関連する問題