当前位置: 首页 > 面试题库 >

客户端从何处获得尚未添加到注册表的远程类的定义?

王鹏飞
2023-03-14
问题内容

我已经成功创建了一个RMI应用程序,该应用程序可以成功完成我需要的操作,但是我很难理解客户端在哪里获取远程对象的定义。例如:

我有一台向rmiregistry注册的服务器(允许客户端调用其上的方法)。

UnicastRemoteObject.exportObject(new Server(), 0);

运行reg.list()确认我的服务器确实已添加到注册表中。我有另一个远程对象(rObj)在与服务器相同的JVM上运行。这不会添加到注册表中。

在我的客户端中,我可以通过Server在rmiregistry中查找来获取Server类的定义:

reg.lookup("Server")

之后,可以自由创建rObj的实例。我的问题的症结在于,即使从未将rObj定义添加到注册表中,我的客户在哪里也可以得到定义。

我知道它必须来自服务器,因为那是存储类和接口的地方。是否Server自动打开管道以接收其他远程类的连接?

如果是这样,客户端如何知道如何在服务器上查找远程类。服务器是否几乎被视为客户端类路径的扩展(它将诉诸服务器检查其自身类路径中是否存在类)?


问题答案:

首先,要意识到不必为了使用RMI而从服务器设置动态类加载。如果将接口和实现都编译到客户端jar和服务器jar中,那么一切都会正常进行。这就是我几乎总是实施RMI的方式。

如果您有充分的理由从服务器动态加载类,则需要在具有接口和实现类的位置(最好是在jar文件中,尽管类目录也可以)建立HTTP服务器。作为RMI的一部分,这不会自动发生,您需要构建jar并将其放置在Web服务器上的某个位置。然后使用系统属性启动客户端,该属性指示此jar文件的URL:

-Djava.rmi.server.codebase=http://webline/public/mystuff.jar

此处详细说明:http
:
//download.oracle.com/javase/1.5.0/docs/guide/rmi/codebase.html



 类似资料:
  • 本规范不排除使用未注册的客户端。然而,使用这样的客户端超出了本规范的范围,并需要额外的安全性分析并审查其互操作性影响。

  • 我想将splashscreen活动添加到我的应用程序中。 我正在使用Android Studio 2.2,预览版3 我只是修改清单,以添加新活动: 这是我的活动。JAVA 如果我更改清单,并放置arround main活动,则应用程序将成功启动 在“我的跑步”窗口中,我可以看到以下消息: adb shell am start-n“me.project.com.project/me.project.

  • 我有一个要求,RMI客户端需要在远程RMI注册表中注册所有远程对象。 第一个问题,我知道有一个registry.list()方法可以返回对象的所有名称。但是,假设还有其他类型的对象也注册了,我如何获得我想要的类型的对象(实现我想要的接口)。我是否应该遍历名称并使用try/catch语句,尝试实例化每个远程对象? 第二个问题是,如果注册了新对象,客户机如何被注意到?在我的要求中,服务器将动态地将新对

  • 显然,可以创建一个TypeDef来根据方言切换实现。 我的问题是hibernate似乎没有识别它,值得注意的是,有一次我将“uuid-custom”作为类型中的静态字符串,并直接在中引用它,所以它并不是实际上不在类路径上。

  • 我写了一个简单的RMI应用程序。我发现客户端在获得RMI-Registry后可以成功执行Registry.unbind()方法。在我看来,这是一种安全风险。为什么允许客户端在远程注册表中取消绑定名称?一个邪恶的人可以通过修改代码来做到这一点,而我的所有其他客户端都无法连接到我的服务器,因为绑定已被删除。 是否有可能在Java策略中否认这一点?

  • 在开始协议前,客户端在授权服务器注册。客户端在授权服务器上注册所通过的方式超出了本规范,但典型的涉及到最终用户与HTML注册表单的交互。 客户端注册不要求客户端与授权服务器之间的直接交互。在授权服务器支持时,注册可以依靠其他方式来建立信任关系并获取客户端的属性(如重定向URI、客户端类型)。例如,注册可以使用自发行或第三方发行声明或通过授权服务器使用信任通道执行客户端发现完成。 当注册客户端时,客