【问题标题】:RMI: object from server with reference as UnicastRemoteObjectRMI:来自服务器的对象,引用为 UnicastRemoteObject
【发布时间】:2016-07-24 19:30:47
【问题描述】:

我在 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 类是可序列化的,这就是为什么它的对象从 RmiServer 转移到 RmiClient(在 getWrapper() 上)。 Foo 实现了Remote 接口,它的对象没有被转移到RmiClient,而不是这个对UnicastRemoteObject 的引用被转移。因此,当在客户端调用 Wrapper.doIt() 时,在服务器端调用 Foo.doIt()。这是正确的吗?如果不是,如何解释这个解决方案?

【问题讨论】:

    标签: java rmi


    【解决方案1】:

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

    您希望我们注意的行仅导出远程对象。没有什么令人吃惊的。

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

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

    是这样吗?

    是的。

    如果不是,如何解释这个解决方案?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多