导出内部对象

时间:2015-01-27 18:49:02

标签: java export rmi

假设我有一台服务器和一台客户端。客户端从服务器请求服务对象。该对象通过复制传输,但也提供回调方法(bar)。如果客户端然后要求服务器更新该对象(updateValue),则服务器将使用RMI调用bar()。 我尝试过类似的东西,但是当从服务器请求对象时出现错误:“无法将com.sun.proxy。$ Proxy1的实例分配给ServiceObjImpl类型的ServiceObjImpl.barWrapper $ ServiceWbImpl实例中的BarWrapper”

服务对象接口:

public interface ServiceObject{
    public int foo();
    public void bar(int var) throws RemoteException;
}

服务器界面

public interface Service extends Remote {
    public ServiceObject get() throws RemoteException;
    public void updateValue(int var) throws RemoteException;
}

服务器实施

public class Server extends UnicastRemoteObject implements Service {
    private static final long serialVersionUID = 247610230875286173L;
    private ServiceObject serviceObj = null;

    public Server() throws RemoteException {
       super();
       serviceObj = new ServiceObjImpl();
   }

    public void updateValue(int var){
        try {
            serviceObj.bar(var);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }


    public ServiceObject get() throws RemoteException {
        return serviceObj;
    }
 }

服务对象实施

class ServiceObjImpl implements ServiceObject, Serializable{
    private static final long serialVersionUID = 1576043218876737380L;
    private int data = 0;
    private BarWrapper barWrapper = new BarWrapper();

    private class BarWrapper extends UnicastRemoteObject implements Remote{
        private static final long serialVersionUID = -5451253032897838145L;

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

        public void bar(int value){
            data = value;
        }
    }

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

    public int foo() {
        return data;
    }

    public void bar(int value) throws RemoteException {
        barWrapper.bar(value);
    }
}

客户端实施

public class Client{
    private Service server = null;
    private ServiceObject obj = null;

    public void get(){
        try {
            obj = server.get();
        } catch (RemoteException e) {
        }
    }

    public void updateValue(int value){
        try {
            server.updateValue(value);
        } catch (RemoteException e) {
        }
    }

     public void foo(){
         System.out.println(obj.foo());
    }
}

1 个答案:

答案 0 :(得分:0)

BarWrapper不实现除remote之外的任何远程接口。但它是一个导出的远程对象,因此它作为存根传递,而不是作为自己的类型传递。所以客户端的类型必须是存根实现的类型,而不是具体类型BarWrapper这就是你得到异常的原因

解决方案:

  • 为其定义新的远程接口
  • 让它实现,
  • 将字段barWrapper的声明从类型BarWrapper更改为新的远程接口类型。