我没有 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 sideFoo.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/