RMI:客户端是否必须拥有所有实现或仅具有接口?

时间:2009-09-29 19:16:54

标签: java architecture rmi

客户端是否必须拥有所有实现或只是接口?

详细说明:让我们拥有远程接口Foo:

public interface Foo extends Remote {
    FooMessage getFooMessage () throws RemoteException;
    void setFooMessage (FooMessage fm) throws RemoteException;
}

客户端和服务器之间的通信是通过FooMessage进行的。

public interface FooMessage {
    String getMsg ();
    void setMsg (String str);  
}

客户端非常简单:

public void clientCode () {
    Foo foo = (Foo)Naming.lookup ("rmi://localhost/FooService");
    FooMessage msg = foo.getFooMessage ();
    msg.setMsg ("asdf");
    foo.setFooMessage (msg);
}

Foo和FooMessage都应该在服务器端具体实现。问题是:客户端是否也有这些实现,或者RMI机制是否隐式地转移实现?

1 个答案:

答案 0 :(得分:1)

使用RMI类加载器的具体实现类can be loaded by the client from the server,。但是,要记住一个共同的“陷阱”:

  1. 除非客户端安装了SecurityManager,否则将禁用RMI类加载器。这旨在限制提供给客户端的任何恶意代码的操作。
  2. 服务器需要指定客户端可访问的“代码库”。这可以是共享文件系统上的file: URL,http:服务器等。这是使用java.rmi.server.codebase系统属性指定的。
  3. (另请注意:链接指南很有用,但它讲的很多关于“存根”;自Java 5以来,最常见的是使用客户端在运行时动态生成的存根。该机制适用于任何其他类但是,需要分享。)