1

私はこの1週間RMIアプリケーションを構築してきましたが、グーグルで解決できないような障害にぶつかりました。

次のコードは、RMIを介してサーバーからクライアントにオブジェクトを送信するために使用されます。

サーバーコード:

import rocks.Rock;
import rocks.squareRock;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server extends UnicastRemoteObject
        implements RemInterface {

    public Server() throws RemoteException {
        super();
    }

    public static void main(String argv[]) {
        try {
            Server serv = new Server();
            Naming.rebind("RockServer", serv);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public Rock getRock() {
        return new squareRock();
    }
}

クライアントコード:

import rocks.Rock;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Client {
    RemInterface reminterface = null;

    public Client() {
        String strName = "rmi://127.0.0.1/RockServer";
        try {
            reminterface = (RemInterface) Naming.lookup(strName);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    public Rock loadRock() {
        try {
            return reminterface.getRock();
        } catch (Throwable t) {
            return null;
        }
    }
}

インターフェース:

public interface RemInterface {
    public Rock getRock() throws RemoteException;
}

この状況では:

  • 「Rock」クラスは、クライアントとサーバーの両方のクラスパスで使用できます。
  • 「Rock」クラスはシリアライズ可能を実装します。
  • 「squareRock」はクラスrockを拡張し、サーバーのクラスパスでのみ使用できます。

クライアントでloadRock()からRockを使用してメソッドを呼び出そうとしたときに発生するエラーは、次のとおりです。

STDERR: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: SquareRock

どんな助けでもいただければ幸いです。

4

1 に答える 1

5

サーバーからType のオブジェクトを返してrocks.squareRockいます。クライアントでの逆シリアル化プロセス中に、このクラスのインスタンスを作成してサーバーからの応答を表すために、このクラスが必要になります。クラスがサーバーのクラスパスでのみ使用可能であることを既に示したように、上記のクラスを見つけてロードできないと、例外が発生します。

解決策はrocks.squareRock、クライアントでもクラスを使用できるようにすることです。

于 2011-05-21T23:35:16.423 に答える