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)
あなたは0.0.0.0のアドレスにあなたのServerSocketをバインドしました:
さらに、このコードはavaliableであるポート天気を教えてくれますか?あなたのJavaプログラムは、あるIP上のポート80と他のSkype上のSkypeをリッスンしていて、なぜJavaがPortAlreadyInUse例外に文句を言わないのかを説明しているでしょうか? – gma
gmaは正しいです、0.0.0.0でバインドしてください。例外。 –
ServerSocket初期化コードを投稿できますか? – gma