非常に単純な rmi クライアント/サーバー アプリケーションがあります。「rmiregistry」アプリケーションは使用しませんが、これを使用してサーバーを作成します。
server = new RemoteServer();
registry = LocateRegistry.createRegistry(PORT);
registry.bind("RemoteServer", server);
クライアント部分は次のとおりです。
registry = LocateRegistry.getRegistry(IPADDRESS, PORT);
remote = (IRemoteServer) registry.lookup("RemoteServer");
ここに魅力的な問題があります。サーバーとクライアントの両方が私の (プライベート) ローカル ネットワークで実行されている場合、アプリケーションは完全に機能します。サーバーを公開サーバーに配置するとすぐに、アプリケーションが 1 分間ハングし、次のエラーが表示されます。
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.ConnectException: Connection refused to host: 192.168.x.y; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source ... (the rest is truncated)
私が考える重要な点は、クライアント (私のプライベート ネットワークで実行されている) が自分自身に接続できないことです(私のアドレスは 192.168.xy で、xy は他の数字ですが、実際のエラー メッセージには私の IP アドレスがそこにリストされていることが示されています)
公共のインターネットで rmi サーバーを強制終了すると、すぐに "接続がホストへの接続を拒否しました: abcd") メッセージが表示されるので、少なくともサーバー側で何かが機能していることがわかります。
助言がありますか?
編集: これをもう少し明確にするために: 192.168.xy はクライアント アドレス、abcd はサーバー アドレスです。スタックトレースは、クライアントがクライアントに接続できないことを示しています。