13

JAVA RMI に関して助けが必要です。テーブルをソートするためのサンプル プログラムを開発しました。しかし、私はこの例外を得ました:

Erreur RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: ServicesTableau

これは私のサーバーソースコードです:

public class Serveur {
    public static void main(String args[]) {

        try {

            System.out.println("Server start ...");
            ServicesTableauImpl od = new ServicesTableauImpl();
            String url = "rmi://" + args[0] + "/ServicesTableauImpl";
            System.out.println("Passe");
            Naming.rebind(url, od);
            System.out.println("Attente d'invocations de client / CTRL-C pour stopper");
        } catch (Exception e) {
            System.out.println("Erreur " + e.getMessage());
        }
    /*
    catch(java.net.MalformatedURLException e){
    System.out.println("Mauvais nom de serveur");
    System.exit(1);
    }
    catch(RemoteException e){
    System.out.println("Pas de Rmiregistry");
    System.exit(1);
    }
    */
    }
}
4

6 に答える 6

18

そのクラスは、RMI レジストリの CLASSPATH では利用できません。これを修正する最も簡単な方法はLocateRegistry.createRegistry().、静的フィールドに結果を保存することにより、同じ JVM でレジストリを開始することです。

于 2012-12-28T23:58:04.193 に答える
0

Orcale からの簡単な例を正常に開始するのに数時間を費やしました。

希望はあなたを助けることができます

まず、Windowsでプログラムを実行します

ここからコードを完全にコピーします

しかし、私はパッケージを削除し、その3つの.classファイルをまとめて説得します

もしあなたがこれに慣れていないなら、あなたもそれをやったほうがいいと思います

パッケージが入ると、問題はより複雑になるため

実行する手順は次の 3 つです。

1.rmiregistryを起動

start rmiregistry -J-Djava.class.path=./

「リモートインターフェース定義」用です

rmir​​egistry がクラスを見つけることができるように

次に ClassNotFoundException を解決します

2.サーバーを実行する

start java Server

次に、出力を確認できます。

サーバー準備完了

3.クライアントを実行する

java Client

出力:

応答: こんにちは、世界!

次に、パッケージの処理方法について話します

通常、Server.class と interface.class ---「リモート インターフェイス定義」

同じパッケージにある必要があります

そして、パッケージで.classを実行する方法を知る必要があります

java {packagename}.Server

クラスパスのデフォルトは「./」です

およびパッケージ宣言は、Server.classに必要なinterface.classを見つけるのに役立ちます

-cp を個別に設定する必要はありません。

ところで、実際のクラスパスを設定しようとすると、代わりにエラーが発生します

「rmiregistryを起動」について

デフォルトのクラスパスはありません

そのため、設定する必要があります

クラスパスのデフォルト値「./」と同じにする必要があります

于 2020-11-08T08:46:00.867 に答える
-3

このエラーは、セキュリティ マネージャ コードが記述されていないために発生し、そのためにクラスをロードできません。そのため、セキュリティ マネージャのコードを必ず追加してください。 
コンパイラがセキュリティ マネージャを見つけられない場合は、新しいセキュリティ マネージャを作成します。メイン メソッドにコードを追加します。

if (System.getSecurityManager() == null) then
    System.setSecurityManager(new RMISecurityManager())
于 2014-10-09T03:22:04.610 に答える