2

親愛なるスタックオーバーフローユーザー。

RMIレジストリの問題をたくさん読んで、問題を解決しようとしましたが、成功しませんでした。だからここに私のケースがあり、誰かが少なくとも少し私を助けてくれることを願っています。

私は学校のプロジェクトのためにマルチプレイヤーのパックマンを作っています。java RMIを使用する必要があるため、3つの素敵なjarファイルを作成しました。モノをリモートサーバーに公開し、マップなどのようなものをロードするメインクラスを含む(のみ)サーバー。いくつかの素敵なフォームを表示するスイングジャンクを含むクライアント。そして3番目にすべてのpacmanコードを含むライブラリ。

サーバーをローカルで起動すると、rmiregistryが起動し、ゲームがサーバーにバインドされます(もちろんセットアップ後)。次に、クライアントをそれに接続して、うまくプレイできます。すべてが機能し、ローカルのrmiregisteryに接続しているView Clientを起動して、ゲームオブジェクトを適切に取得できます。その後、サーバーから独立してレジストリを起動し、プログラムを完全に実行しました。私のラップトップ(127.0.0.1ではない)のIPを介しても、正常に機能しました。レジストリのクラスパスを設定しなかったことに注意してください。

その後、サーバーに移動しました(2008)。クラスパスなしでそこでrmiregistryを開始し、server.jarをそれに接続しようとしましたが、失敗しました。(..spelクラスの例外が見つかりませんでした)クラスパスを修正しました....効果がありません....新しいコンソールを開いて新しいレジストリを開始し、pacman.jarをc:\にコピーして、サーバーを実行しました.jar with -Djava.rmi.server.codebase = c:\ paramether ....効果がない...次にセキュリティマネージャーを設定します...(System.setSecurityManager(new RMISecurityManager());)そして以下を含むポリシーを作成しgrant {permission java.security.AllPermission;};、サーバーを使用してサーバーを実行しました.jar -Djava.rmi.server.codebase = c:-Djava.security.policy =server.policy...これも効果はありません。

私は同じ例外を受け取り続けます:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: Tervoort.Bram.Packman.Spel
        at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
        at sun.rmi.transport.Transport$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)

問題が何であるかについて誰かが何か手がかりを持っていますか?そしてそれを修正する方法は?

4

1 に答える 1

0

これも役立つ場合があります。A.2を見てください。どういうわけかそうです。提供されたURLにクラスが見つかりません。URLが正しく形成され、必要なすべてのクラスがクラスパス上にあることを確認してください。

「リモートオブジェクトがRMIによってマーシャリングされると(リモート呼び出しへの引数として、または戻り値として)、スタブクラスのコードベースがRMIによって取得され、シリアル化されたスタブに注釈を付けるために使用されます。スタブがマーシャリングされていない場合、コードベースは、RMIClassLoaderを使用してスタブクラスファイルをロードするために使用されます。ただし、クラスがCLASSPATHで、またはアップルトコードベースなどの受信オブジェクトのコンテキストクラスローダーによってすでに検出されている場合を除きます。

_StubクラスがRMIClassLoaderによってロードされた場合、RMIはアノテーションに使用するコードベースをすでに認識しています。_StubクラスがCLASSPATHからロードされた場合、明白なコードベースはなく、RMIはjava.rmi.server.codebaseシステムプロパティを参照してコードベースを見つけます。システムプロパティが設定されていない場合、スタブはnullコードベースでマーシャリングされます。つまり、クライアントのCLASSPATHに_Stubクラスファイルの一致するコピーがない限り、スタブは使用できません。」

于 2011-04-26T19:56:31.457 に答える