2013-05-16 16 views
6

JavaアプリケーションがWindows上で別のプロセスが既にバインドされているソケットにバインドされないようにするにはどうすればよいですか?既にバインドされているソケットにアプリケーションがバインドされないようにする

私はポート80でリッスンしているJavaアプリケーションを持っている問題があります。アプリケーションは正常に起動し、例外は報告されません。私はポート80で接続できなかった理由を理解できませんでした。他のポートも正常に動作しました。私は80で聞いている他のプロセスのためにnetstatを調べ、Skypeを見つけました。私はそれが可能だとは思っていませんでしたが、いくつかの調査の後、私はSkypeがSO_REUSEADDRオプションを聞いていると推測しています。この状態では、受け入れ側のアプリケーションは不確定です。私はJavaアプリケーションがこのインスタンスでバインド例外(またはその他)で失敗するようにしたいと思います。

私はJava経由でそのオプションにアクセスできればSO_EXCLUSIVEADDRUSEを使うことができるようですが、それは可能ではないと思います。 SO_REUSEADDRには多くの質問と回答がありますが、私の質問に答えたものはありません。これはSkypeだけではなく(私はリスニングパートをオフにすることができます)、私は自分のプログラムがこの状況でより堅牢になりたいと思っています。

これは、Windows 7のボックスには、netstat -abnからの抜粋です:

Proto Local Address   Foreign Address  State 
    TCP 0.0.0.0:80    0.0.0.0:0    LISTENING [java.exe] 
    TCP 0.0.0.0:80    0.0.0.0:0    LISTENING [Skype.exe] 

私はSkypeがSO_REUSEADDR

を使用しているプロセスがリッスンするように表示されないことを仮定している理由です異なるインターフェース。

コードのスニペットを示します。ポート番号は80:

さらに詳しい情報として、副作用や誤ったメッセージを最小限に抑えるためのサンプルプログラムを作成しました。

import java.net.ServerSocket; 

    public class PortTest 
    { 
     public static void main(String[] args) 
     { 
      System.out.println("Hit Ctrl-C to stop.\n"); 

      try { 
       ServerSocket myServerSocket = new ServerSocket(80); 
       System.out.println("Before the accept() call."); 
       myServerSocket.accept(); 
       System.out.println("After the accept() call."); 
      } 
      catch (Exception ex) { 
       System.out.println("Error listening."); 
       ex.printStackTrace(); 
      } 
     } 

    } 

このサンプル・プログラム(PortTest)を実行しているとき、私はまだ例外を取得しないとSkypeが実行され、ポート80でリッスンし、テストを促進するためにされたとき、私はPortTest 2番目のインスタンスを実行すると私は見ていますポートインユースメッセージ。

Error listening. 
    java.net.BindException: Address already in use: JVM_Bind 
      at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
      at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) 
      at java.net.AbstractPlainSocketImpl.bind(Unknown Source) 
      at java.net.PlainSocketImpl.bind(Unknown Source) 
      at java.net.ServerSocket.bind(Unknown Source) 
      at java.net.ServerSocket.<init>(Unknown Source) 
      at java.net.ServerSocket.<init>(Unknown Source) 
      at PortTest.main(PortTest.java:10) 
+2

あなたは0.0.0.0のアドレスにあなたのServerSocketをバインドしました:

さらに、このコードはavaliableであるポート天気を教えてくれますか?あなたのJavaプログラムは、あるIP上のポート80と他のSkype上のSkypeをリッスンしていて、なぜJavaがPortAlreadyInUse例外に文句を言わないのかを説明しているでしょうか? – gma

+0

gmaは正しいです、0.0.0.0でバインドしてください。例外。 –

+0

ServerSocket初期化コードを投稿できますか? – gma

答えて

2
socket = new ServerSocket(0); 

自動的に空いているポートを選択します。

boolean portAvaliable = true; 
    ServerSocket s = null; 
    try { 
      s = new ServerSocket(yourPort); 
     } 
    catch (IOException e) 
     { 
      portAvaliable = false; 
     } 
    finally { 
     if (s != null) 
      try { 
       s.close(); 
       } 
      catch (IOException e) 
       { 
       //handle the exception 
       } 
+0

私はランダムに無料ではなく、特定のポートでリッスンする必要があります。また、今私のコードでこれを効果的にやっています。しかし、例外はスローされないので、私の問題です。 –

関連する問題