4

非常に単純な 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 はサーバー アドレスです。スタックトレースは、クライアントがクライアントに接続できないことを示しています。

4

3 に答える 3

3

仮想マシンに次のパラメーターを指定してサーバーを実行してみてください。

-Djava.rmi.server.hostname=hostname_of_the_server
于 2010-03-10T14:45:04.473 に答える
1

192.168.* にはプライベート IP アドレスが含まれています (10.* と同様)。これらは、オープンなインターネットではルーティングされません。サーバーにパブリック IP アドレスを使用していること、およびすべてのファイアウォール (NAT を含む) がアクセス用に構成されていることを確認する必要があります。必要なポートで telnet を使用して簡単に確認できます。

于 2009-06-01T18:41:16.870 に答える
0

サーバーがソケットを開いてクライアントに戻そうとすると失敗すると思いますが、例外の文言は少し不明確です。

RMI は、NAT にあまり適していません (IIRC)。

于 2009-06-01T23:21:40.363 に答える