2016-07-24 101 views
0

我没有RMI的经验,并且我在互联网上发现了一些我不确定的代码。所以有rmi客户端和rmi服务器。RMI:引用为UnicastRemoteObject的服务器的对象

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(在getWrapper())上被转移到RmiClientFoo implements Remote interface并且它的对象不被转移到RmiClient,而不是被转移的UnicastRemoteObject。所以当在客户端Wrapper.doIt()被调用时,然后在服务器端Foo.doIt()被调用。这是正确的吗?如果不是,如何解释这个解决方案?

回答

1

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

你想让我们注意的行仅仅是输出远程对象。没有什么惊人的。

因此,当在客户端Wrapper.doIt()被调用,然后在服务器端Foo.doIt()被调用。

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

这是正确的吗?

是的。

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

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