2009-10-02 44 views
9

JavaアプレットからローカルIPアドレスを特定したいと思います。問題は、LANとインターネット接続 (palm、VMWare ...)を持つ同じマシンに複数のIPアドレスがある場合です。Javaアプレットから正しいローカルIPアドレスを取得

public static void main(String[] args) { 
     try { 
     String hostName = InetAddress.getLocalHost().getHostName(); 
     System.out.println("HostName = " + hostName); 
     System.out.println("HostAddressLocal = " + 
      InetAddress.getLocalHost().getHostAddress()); 
     InetAddress[] inetAddresses = InetAddress.getAllByName(hostName); 
     for (InetAddress inetAddress : inetAddresses) { 
      System.out.println("hostAddress = " + inetAddress.getHostAddress()); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

結果は次のとおりです:

は、ここに私のテストです

HostName = xxxx 
    HostAddressLocal = xx.xx.xx.xx 
    hostAddress = 10.10.11.51 
    hostAddress = 192.168.23.1 
    hostAddress = 192.168.106.1 

XX.XX.XX.XXが正しいアドレスではありません。正しいのは10.10.11.51です。 jarnbjoに応じて


EDIT:

あなたの水晶玉は真実を言います。あなたは私の問題を理解している。クライアントはプロキシ経由で接続できるため、最初の点は使用できません。私は自分のコンピュータ上で以下のコードを実行する場合:GETHOSTNAMEの底に

Internet IP = /127.0.0.1 

そしてない10.10.11.51

+0

アプレットですか?メインとローカルのUPアドレスにアクセスできますか? –

+0

私たちもその問題を抱えていました。 – KLE

+3

あなたは正確に何をしようとしていますか?なぜこの情報が必要ですか?ユーザーがローカルアドレスを持っていない場合はどうなりますか?ユーザーが多くのインターフェイスと多くのローカルアドレスを持っている場合はどうなりますか?ユーザーがIPv6を持っている場合(各インターフェイスに潜在的に多くのアドレスがある可能性があります)あなたのプログラムにはいくつかの設計上の問題があります。正しく動作するためにはこの特性に決して頼るべきではありません。 – Juliano

答えて

-1

()C関数のgethostbyname():

Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

を、私はこの結果を持っています。最初は/ etc/hostsを探してからDNSを使って解決しようとしました。したがって、10.10.11.51 myhostnameを/ etc/hostsに追加すると、getHostName()はそれを正しく検出するはずです Windowsでは/ etc/hosts、\ WINDOWS \ System32 \ ServisesなどのAFAIRに類似しています...

これは名前解決の問題のみです。

コードでは、最初にホスト名(hostName = InetAddress.getLocalHost()。getHostName();)を取得します。 この関数は、システムのインストール時に設定されたコンピュータ名を返します。 具体的なホスト名のすべてのIP(InetAddress.getAllByName(で、hostName))次に、あなたが得る - このリターンすべてのIPは、このホスト名

簡単な例で解決

1の/ etc /この

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
などのホスト

あなたのコードのリターンは

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

のように見えるように2変更の/ etc/hosts私のUbuntuボックスの名前 -
 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

あなたのコードは

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 
hostAddress = 192.168.1.1 
hostAddress = 20.20.20.20 

フレッド・デスクトップを返します。

+0

これは問題ではありませんでした。問題は名前解決ではなく、複数のインタフェースが存在する可能性があるという事実です。 – sleske

+0

非常に悪いと投票しても答えに注意を払わなくても... –

+0

質問はJava用で、別の目的のためにCの呼び出しをします – Mark

11

あなたがすでに発見したように、コンピュータはIPアドレスの異なるいくつかのネットワークインターフェイスを持っている可能性があります。実際には正しいので、どちらが「正しい」と考えるかは少し難しいでしょう。

私のクリスタルボールは、クライアントがサーバに接続するために使用しているIPアドレスを意味しています。サーバー上で

  • は、あなたが動的に生成されたHTMLページにアプレットを埋め込むと、アプレットのパラメータとしてクライアントのIPアドレスを追加することができます。その場合は、少なくとも二つの可能性があります。少なくとも、プロキシ経由でHTTPを実行していない場合、WebサーバーはクライアントのIPアドレスを判断し、アプレットに渡すことができます。アプレットで

  • 、あなたがアプレットをロードし、そこからWebサーバにTCPソケットを開き、ローカルアドレスは、接続のために使用されている確認することができます。

Socket s = new Socket("www", 80); 
InetAddress ip = s.getLocalAddress(); 
s.close(); 
+0

ありがとう!質問の私の編集を参照してください。 – EFalco

+0

これは、通常、デフォルトのサンドボックスモードでセキュリティ権限が不足しているため、最近はアプレットでは機能しません。アプレットの[ポリシーファイル]にアプレットに[java.net.NetPermission.getNetworkInformation](http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html)を付与する必要があります](http://docs.oracle.com/javase/tutorial/security/tour1/step2.html)を参照してください。 –

+0

"www"のソケットを作成する作業が停止しました。私の質問を参照してください:http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working- OK –

関連する問題