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

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

最佳答案

这一切完全没有意义。导出的远程对象已序列化为其 stub 。 stub 已经是可序列化的。包装类在这里没有添加任何有用的内容。扔掉,直接使用 stub 即可。

您希望我们注意的行仅导出远程对象。没有什么值得惊讶的。

So when on client side Wrapper.doIt() is called then on server side Foo.doIt() is called.

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

Is this right?

是的。

If not, how to explain this solution?

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

关于java - RMI:来自服务器的对象,引用为 UnicastRemoteObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555937/

相关文章:

java - 在具有枚举 (EnumType.STRING) 的实体上使用 LIKE 运算符执行 JPA 查询

java - 使用 Java-JDBC 从 Oracle 数据库读取数据时的字符编码

java - 序列化和 RMI

java - 还需要 rmic 吗?

java - 类加载器 : java. io.FileNotFoundException : file:/home/aaa/. m2/repository/com/st/module-1.1-SNAPSHOT.jar!/com/st/resource (没有这样的文件或目录)

java - 试图修复机器人 "ill-advised or mistaken usage of a core class"坏了

java - 从多个整数列表中找到 K 个最高和

java - 显式设置分布式 GC 的间隔似乎不起作用

java - RMI stub 和子类继承

java - RMI、EJB 和回调