java - RMI 中命名和注册表的区别

标签 java registry rmi

我用过

Naming.rebind("rmi://localhost:1099/RmiServer", c);

其中 c 是一个远程对象。和

 XYZ robj=new XYZ();
 ABC stub = (ABC) UnicastRemoteObject.exportObject(robj, 0);
 Registry registry = LocateRegistry.getRegistry();
 registry.bind("RmiServer", stub);

其中 stub 是远程对象。

如果 rmiregistry 已经在运行,第一种情况可以正常工作,但后者会抛出 ServerException that ClassNotFoundException 是为 ABC 类抛出的。我哪里错了?

Naming 和 Registry 有何不同,这里 Naming 是绑定(bind)到本地主机,而稍后是动态获取相应的端口和地址,然后将对象绑定(bind)到它。

最佳答案

The first case is working fine if the rmiregistry is running already,but the later is throwing ServerException that ClassNotFoundException is thrown for ABC class. Where am i going wrong?

你有那个回到前面。如果您使用单独的 rmiregistry,如果远程接口(interface)和 stub 等不在 rmiregistry 的 CLASSPATH 上,您将得到 ClassNotFoundExceptions。如果您通过 LocateRegistry.createRegistry() 在进程中启动注册表,那是不可能发生的,否则导出会在 bind() 之前失败。

Also how are Naming and Registry different in the sense that here Naming is binding to local host whereas later is getting the corresponding port and address dynamically and then binding the object to it.

Naming 提供了一组与注册表接口(interface)的静态方法,您无需调用 LocateRegistry.getRegistry()。 API 非常相似,但名称字符串不同:它们是基于 URL 的。

对于 Naming 类,所有名称字符串都是 RMI URL,例如rmi://localhost:1099/.这适用于所有方法:bind()、rebind()、unbind()、lookup() 和 list()。

使用Registry 接口(interface),所有名称字符串都只是字符串,例如<服务器名称>.

因此,如果您在代码的不同部分使用这两个类,则需要保持这一点以确保互操作性。例如,可以在注册表界面中使用命名风格的 URL,它们仅被视为字符串,但 Naming.list() 的结果将类似于 rmi://localhost:1099/rmi://localhost :1099/<服务器名称>。所以不要那样做。

在这两种情况下,您从 list() 返回的名称与您提供给其他方法之一的名称类型相同。

关于java - RMI 中命名和注册表的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771787/

相关文章:

go - 如何通过 go 编程语言从运行在 64 位系统上的 x86 应用程序的注册表中获取值?

java - 使用 RMI 的 ClassNotFoundException

java - Pyro4与java连接

java - 验证 IAM 用户凭证

c# - 在注册表中保存文本框值

java - Java中的继承到底发生了什么?

powershell - 如何使用PowerShell以管理员身份运行带有参数的程序

java - 数据交换格式和 Java 序列化

java - 从 -D 变量设置 Spring 单元测试配置文件

java - 将排序链表转换为平衡 BST