RMI:来自服务器的对象,引用为 UnicastRemoteObject
RMI: object from server with reference as UnicastRemoteObject
我对 RMI 没有经验,我在互联网上发现了一些我不确定的代码。于是就有了rmi client和rmi server。
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
class 是可序列化的,这就是它的对象从 RmiServer
转移到 RmiClient
的原因(在 getWrapper() 上)。 Foo
实现了 Remote
接口并且它的对象没有转移到 RmiClient
,而是转移了对 UnicastRemoteObject
的引用。因此,当在客户端 Wrapper.doIt()
被调用时,服务器端 Foo.doIt()
被调用。这是正确的吗?如果不是,如何解释这个解决方案?
完全没有意义。导出的远程对象已序列化为其存根。存根已经是可序列化的。包装器 class 在这里没有添加任何有用的东西。扔掉直接用存根就行了
您要我们注意的那一行只是导出了远程对象。没什么大惊小怪的。
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?
我无法解释。有人添加了一个毫无意义的包装器 class。请勿模仿。
我对 RMI 没有经验,我在互联网上发现了一些我不确定的代码。于是就有了rmi client和rmi server。
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
class 是可序列化的,这就是它的对象从 RmiServer
转移到 RmiClient
的原因(在 getWrapper() 上)。 Foo
实现了 Remote
接口并且它的对象没有转移到 RmiClient
,而是转移了对 UnicastRemoteObject
的引用。因此,当在客户端 Wrapper.doIt()
被调用时,服务器端 Foo.doIt()
被调用。这是正确的吗?如果不是,如何解释这个解决方案?
完全没有意义。导出的远程对象已序列化为其存根。存根已经是可序列化的。包装器 class 在这里没有添加任何有用的东西。扔掉直接用存根就行了
您要我们注意的那一行只是导出了远程对象。没什么大惊小怪的。
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?
我无法解释。有人添加了一个毫无意义的包装器 class。请勿模仿。