2

Sun/Oracle の Web サイトにある RMI Compute PI チュートリアルを実装しようとしています。サーバーは、Amazon Windows EC2 サーバー上にあります。クライアントは自宅のパソコンにあります。簡単にするために、サーバーのファイアウォールを無効にし、EC2 セキュリティ グループのすべてのポートを開きます。マシンに ping を実行したり、ファイルにアクセスしたりできます。私の目的は、基本的な RMI プログラムを AWS で動作させることです。セキュリティの問題は後で監督します。

サーバーの起動は問題ありません。また、RMI レジストリに正しくバインドされています。次のコマンドを使用して起動しています。

java -Djava.security.manager -Djava.security.policy=C:\AWSTest\security.policy -Djava.rmi.server.codebase=file:/C:/AWS/Sources/sun-rmi-tutorial-server/bin/ file:/C:/AWS/Sources/sun-rmi-tutorial-common/bin/ -classpath C:\AWS\Sources\sun-rmi-tutorial-server\bin;C:\AWS\Sources\sun-rmi-tutorial-common\bin engine.ComputeEngine ec2-XX-XX-XX-XXX.ap-southeast-1.compute.amazonaws.com

  • RMI レジストリはサーバー側で開始されます。
  • サーバー側で新しいセキュリティ マネージャを宣言しましたSystem.setSecurityManager(new RMISecurityManager())
  • security.policyすべての許可が与えられているファイルを使用しています。

ローカル コンピューターでクライアント側を起動すると、UnmarshalException で終了します。

ComputePi exception: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: engine.ComputeEngine_Stub
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: engine.ComputeEngine_Stub
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:101)
    at client.ComputePi.main(ComputePi.java:14)
Caused by: java.lang.ClassNotFoundException: engine.ComputeEngine_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:453)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:184)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:216)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1593)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    ... 3 more

何が間違っているかについて何か提案はありますか? クライアントが正しい Stub を見つけられないのはなぜですか? Eclipse Juno、Genady RMI Plugin、および Java 1.7.0_07 を使用しています。

ご協力いただきありがとうございます

編集1:

Java ワークスペースは、クライアント側、サーバー側、およびサーバーとクライアントの両方がクラスを共有する共通プロジェクトの 3 つのプロジェクトを中心に構成されています。

  • ローカル コンピューターからリモート レジストリを読み取ることができます。RMI プラグインは、リモートでサーバーに接続し、レジストリを検査できます。

  • 3 つのプロジェクトを作成する代わりに、すべてのクラスを同じプロジェクトの下に配置すると、すべてが正常に機能します...しかし、生成された (または必要な) スタブがないことに気付きました。

  • クライアント側で、サーバー クラスへの参照をクラスパスに入れている場合 (すべてローカルでビルドされている)、アンマーシャリング エラーではなく、接続タイムアウト エラーが発生します。

    ComputePi 例外: ホストへの接続が拒否されました: XX.XXX.XX.XX; ネストされた例外は次のとおりです: java.net.ConnectException: 接続がタイムアウトしました: 接続 java.rmi.ConnectException: ホストへの接続が拒否されました: XX.XXX.XXX; ネストされた例外は次のとおりです: java.net.ConnectException: 接続がタイムアウトしました: sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) で接続します。 :216) で sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) で sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128) で engine.ComputeEngine_Stub.executeTask(ComputeEngine_Stub.java: 35) client.ComputePi.main(ComputePi.java:19) で 原因: java.net.ConnectException: 接続がタイムアウトしました: java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net で接続します。

4

1 に答える 1

1

スタブクラスをクライアントにデプロイしていません。

于 2012-11-19T18:06:20.720 に答える