RMI:来自服务器的对象,引用为UnicastRemoteObject

时间:2016-07-24 19:30:48

标签: java rmi

我对RMI没有经验,我在互联网上找到了一些我不确定的代码。所以有rmi客户端和rmi服务器。

public class RmiServer{
  public Wrapper getWrapper(){
      return new Wrapper(new Foo());
  }
}

public class Wrapper implements Serializable{
  private FooI foo;
  public Wrapper(FooI foo){
   this.foo=foo;
  }
  public void doIt(){
   foo.doIt();
  }
}

public interface FooI extends Remote{
  public void doIt();
}

public class Foo implements FooI{
 public void doIt(){...}
 public Foo(){
   //PLEASE, PAY ATTENTION TO THIS LINE
   UnicastRemoteObject.exportObject(this, 8888);
 }
}

我以这种方式向自己解释这段代码。 Wrapper类是可序列化的,这就是为什么它的对象从RmiClient(在getWrapper()上)转移到RmiServer的原因。 Foo实现Remote接口,其对象不会转移到RmiClient,而是转移此UnicastRemoteObject的引用。因此,当在客户端Wrapper.doIt()被调用时,则调用服务器端Foo.doIt()。这是正确的吗?如果没有,如何解释这个解决方案?

1 个答案:

答案 0 :(得分:1)

这一切都毫无意义。导出的远程对象已经序列化为其存根。存根已经是可序列化的。包装器类在这里没有添加任何有用的东西。把它扔掉,直接使用存根。

您希望我们注意的行只是导出远程对象。没什么好吃的。

  

因此,当调用客户端Wrapper.doIt()时,将调用服务器端Foo.doIt()

Wrapper.doIt()调用foo.doIt(),在服务器上执行Foo.doIt()。但是,如果客户端直接调用foo.doIt(),则会发生同样的事情。这正是RMI已经做过的事情。

  

这是对的吗?

  

如果没有,如何解释这个解决方案?

我无法解释。有人添加了一个毫无意义的包装类。不要模仿。