当我使用 JNDI 从远程服务器获取对象时,可以将对象序列化到本地 JVM,这样我假设我们可以在本地调用该对象上的方法而无需 RMI,那么为什么我们需要 RMI?
3 回答
JNDI是一种查找和目录服务。它提供了一种在某些上下文中按名称获取资源的标准化方法。通常它用于从应用程序服务器上下文获取共享资源,但根据实现,它还可以提供以标准化方式查找表示远程资源的项目。
RMI是 Java 平台内置的远程方法调用技术。它允许通过二进制协议调用远程 java 对象方法。它使用 Java 的内置序列化处理来使远程调用和通过网络传递的参数看起来是透明的。RMI 需要它自己的目录/查找服务,该服务或可能不与给定的 JNDI 实现集成。(通常它们不集成。)
因此,考虑到所有这些,希望您能明白为什么您的问题不是很清楚。您可以通过 JNDI 查找远程 RMI 服务。您也许可以将远程 RMI 引用保存(序列化)到磁盘,然后重新构建它以便以后再次使用它(尽管这可能不是一个好主意。)但是无论如何,JNDI 和 RMI 是两个不同的东西。
当我使用 JNDI 从远程服务器获取对象时,可以将对象序列化到本地 JVM,这样我假设我们可以在本地调用该对象上的方法而无需 RMI,那么为什么我们需要 RMI?
所以你可以远程调用方法。已反序列化到本地 JVM 中的对象在 JVM 中执行。即使您从本地 JVM 调用远程对象,它也会在远程 JVM 中执行。
我假设我们可以在没有 RMI 的情况下在本地调用这个对象的方法
不,重要的是要了解在进行远程方法调用时需要两个额外的对象。在客户端运行的 Stub 和在服务器端运行的 de Skeleton。这些对象执行必要的低级操作。
当客户端调用远程方法时,它从不直接调用对象,而是使用 Stub 对象。
因此,您从 JNDI 服务获得的是 Stub 而不是远程对象。