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 で接続します。