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

您正在rocks.squareRock从服务器返回一个类型的对象。在客户端的反序列化过程中,将需要此类以创建此类的实例来表示来自服务器的响应。正如您已经指出该类仅在服务器的类路径中可用,定位和加载所述类的失败会导致异常。

解决方案是使rocks.squareRock该类也可以在客户端中使用。

于 2011-05-21T23:35:16.423 回答