我是 RMI/JAVA 新手,正在使用 Oracle 网站 http://docs.oracle.com/javase/tutorial/rmi/client.html上的 rmi 教程
我能够跟踪整个事情,直到它来到 Client.pi 类。第一行是导入任务接口 import compute.Task 的代码
我的问题是,Java 怎么知道从哪里获取任务接口?它是服务器上的非远程接口,所以我对如何导入它有点困惑。
我是 RMI/JAVA 新手,正在使用 Oracle 网站 http://docs.oracle.com/javase/tutorial/rmi/client.html上的 rmi 教程
我能够跟踪整个事情,直到它来到 Client.pi 类。第一行是导入任务接口 import compute.Task 的代码
我的问题是,Java 怎么知道从哪里获取任务接口?它是服务器上的非远程接口,所以我对如何导入它有点困惑。
您将提供任务接口以及远程接口(计算)作为客户端 API jar 的一部分。
通常,在设计任何类型的 RMI 服务器系统时,您最终会得到 2 个模块,即服务器 API 和服务器实现(这将取决于 API)。然后,您将向正在为您的服务器构建 RMI 客户端的任何人提供服务器 API jar。
该Task
接口对客户端和服务器代码都是通用的,因此客户端和服务器中都需要有副本。
Pi
实施需要对Task
客户可用。理想情况下,服务器不应该知道客户端的任务,所以不应该有自己的副本。因此,客户端上的 RMI 使用可以加载代码的 URL 来注释对象流中的类。服务器使用这个注解来动态加载实现类,这个实现类可能是在服务器实例启动后编写的。
虽然这是一个巧妙的聚会技巧,但要安全地加载远程代码可能会很棘手。设置java.rmi.server.useCodebaseOnly
为true
禁用该功能,我强烈推荐。