【问题标题】:RMI: Does the client have to have all implementations or just interfaces?RMI:客户端必须拥有所有实现还是只有接口?
【发布时间】:2009-09-29 19:16:54
【问题描述】:

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

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

【问题讨论】:

    标签: java architecture rmi


    【解决方案1】:

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

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

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

    【讨论】:

    • 客户端需要FooMessageImpl,但不需要FooImpl。
    • 是的,澄清一下,Foo 的客户端实现只是一个存根,由 RMI 运行时动态实现。它负责与服务器上运行的真实FooImpl 进行通信。
    猜你喜欢
    • 2015-04-16
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多