私は Windows 7 (Professional、64 ビット) システムで作業していますが、現在の状況を見てきました。Java 6 (JRE のみ) と Java 7 (JDK) の両方を 64 ビットでインストールしました。
コマンドプロンプトから、ディレクトリから実行します
rmiregistry.exe
(デフォルトポート1099) 。jre6/bin
それが実行されている間に、別のコマンドプロンプトからもう一度実行しようとします。ポートが既にバインドされているという例外が返されます。rmiregistry.exe
fromjdk7/bin
ディレクトリと同じです。同じ例外、既にバインドされています。コマンドプロンプトから、ディレクトリから実行します
rmiregistry.exe
(デフォルトポート1099) 。jre6/bin
それが実行されている間、別のコマンドプロンプトから、ディレクトリrmiregistry.exe
から(デフォルトポート1099)を実行しようとします。jdk7/bin
走る!調べてnetstat -a -b -o
結果を見ると、両方の PID が IPv4 と IPv6 のポート 1009 をリッスンしています。最初に実行されるものは、RMI 操作と API に応答します。
それはどのように可能ですか?2 つの RMIRegistry がポート 1099 でリッスンするにはどうすればよいですか? 何か不足していますか?
助けてくれてありがとう。
これに関する詳細:
- Java 6 RMI レジストリを実行すると、例外スタック トレースは;
Caused by: java.net.BindException: Address already in use: JVM_Bind
からに戻ります。java.net.PlainSocketImpl.socketBind(Native Method)
- Java 7 RMI レジストリを実行すると、代わりに例外スタックトレースが
java.net.DualStackPlainSocketImpl.bind0(Native Method)
.
意味はありますか?これは-Djava.net.preferIPv4Stack=true
VM オプションと関係がありますか? Java 7 から、IPv4 と IPv6 の両方の RMI ポートが Java 6 または Java 7 RMI レジストリのいずれかによって占有されているかどうかを知るにはどうすればよいですか?
またまた詳しく…
私はすべてを止めました。単なる「楽しみ」として、Calibre (電子書籍管理アプリケーション) の内部 Web サーバーをポート 1099 で実行しました。
rmiregistry.exe
Java 6から、ポートがビジーであるため実行できないと表示されます。rmiregistry.exe
Java 7 から実行されます... しかし、以前と同様に、ポート 1099 の応答は Calibre から来ています。
もう1つ:Ubuntu(OpenJDKを使用)で同じRMIレジストリ(Java 6 + Java 7、32ビット)を実行すると、(Java 7の場合でも)「Port already in use」メッセージが表示されますjava.net.PlainSocketImpl.socketBind(Native Method)
。同じポートを 2 つ占有することはできません... いつものように! 少なくとも、Windows 7 + Java の問題であることはわかっています。
他にヒントはありますか?
DatagramSocket を使用して似たようなものを見ました: Java 6 のポートで使用しています。次に、Java 7 で別の同じアプリケーションを実行し、既に使用されている場合でも、そのポートに接続します (ただし、機能しません)。次に、Java 7 を使用して 3 番目の同一のアプリケーションを起動すると、このアプリケーションはそのようなポートがすでにビジーであることに気づきます。これは RMI レジストリでも同じだと思います。
同じポートで 2 つの RMI レジストリを実行できるのはなぜですか? Java 6 と Java 7 が、ソケットとポートに関して、ある意味で「競合する」動作をするのはなぜですか? また、Windows (私の状況では 7) が同じポートで 2 番目の要求をブロックしないのはなぜですか?