0

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

详细说明:让我们有远程接口 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 机制隐式传输实现?

4

1 回答 1

1

客户端可以使用 RMI 类加载器从服务器加载具体的实现类。但是,要记住一个常见的“陷阱”:

  1. 除非客户端安装了 RMI 类加载器,否则它会被禁用SecurityManager。这旨在限制提供给客户端的任何恶意代码的操作。
  2. 服务器需要指定客户端可以访问的“代码库”。这可以是file:共享文件系统、http:服务器等上的 URL。这由java.rmi.server.codebase系统属性指定。

(另请注意:链接指南很有用,但它谈论了很多关于“存根”的内容;从 Java 5 开始,最常见的是使用客户端在运行时动态生成的存根。该机制适用于任何其他需要但是,共享。)

于 2009-09-29T19:23:11.217 回答