RMI注册表绑定问题

3

我正在虚拟机上运行RMI Registry(运行Windows XP),IP为192.168.133.2,尝试绑定一个运行在不同虚拟机上的RMI服务器(XP IP:192.168.133.3),使用以下代码:

Naming.rebind("//192.168.133.2/rmi.2", new RMI());

where

public class RMI extends UnicastRemoteObject

但是我收到了这个异常:
    java.rmi.AccessException: Registry.Registry.rebind disallowed; origin /192.168.133.3 is non-local host

我发现RMI注册表不接受任何不在同一运行机器上的rmi服务器。但是如何让该注册表接受我的rmi服务器呢?
附注:我正在使用JBuilder X作为IDE。
我正在尝试实现一个移动代理,它将在一些rmi服务器上运行以执行一些工作,并将结果返回到起始站点,因此RMI服务器实现了托管此代理的环境,以执行其工作并将其发送到下一个站点,该站点将通过注册表定位。
2个回答

4
尝试绑定运行在不同 XP IP(192.168.133.3) 的 RMI 服务器。请停下来,你不能这样做。你只能将 RMI 服务器绑定到与执行绑定的代理程序相同的主机上运行的注册表中。请注意,这并不一定意味着远程对象本身运行在相同的主机上。例如,客户端可以查找远程注册表并将检索到的存根绑定到本地注册表中。但是你不能将任何内容绑定到远程注册表。

1

RMI不提供任何形式的“联合”或分布式命名服务。

RMI被设计为允许您在服务器上运行RMI注册表。它托管可以通过网络访问的服务,但是这些服务在该服务器上本地运行。

提供的服务必须在服务器上启动和“重新绑定”,而不是在任何客户端系统上。仅限本地地址。

然后,您的客户端应该连接到该服务器...


我正在尝试实现一个移动代理,它将在一些RMI服务器上运行以执行一些工作并将结果返回到起始站点。因此,RMI服务器实现了托管此代理执行其工作并将其发送到下一个站点的环境,该站点通过注册表进行定位。那么你是说我不能创建多主机服务器(每个服务器在不同的机器上但在同一网络上运行)。对吗? - Ibrahim.I
我是说你的“多主机”集合中的每个服务器都必须单独运行本地rmiregistry,其中绑定了您服务的本地副本。如果您希望客户端能够旋转到不同的RMI服务,则这是RMI提供的上一层;您将不得不想出某种在RMI之外完成此操作的方法(JNDI命名可能会有所帮助 :-) - Richard Sitze
但是,如果代理正在机器A上运行并希望移动到机器B,如果没有包含所有服务的统一注册表,它如何找到B? - Ibrahim.I
这是一个很好的问题,但RMI并没有提供答案。 - Richard Sitze
您的描述已经足够接近于解决这个问题,但依然不准确。注册表只会接受本地主机上运行的进程发送的bind/rebind/unbind请求,但并没有要求被绑定的对象也必须在本地主机上运行。例如,一个程序可以在远程注册表中查找对象,并将它们绑定到本地注册表中;这样,本地注册表就会包含对在远程主机上运行的服务器的引用。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接