2012-05-16 63 views
1

这似乎是一个简单的问题,但我不能找到明确的答案:所有网络流量是否都通过RMI注册表?

说我有一个当地的非防火墙的网络上的三台服务器,其中一个是注册表(R)和其他两个是客户端(A和B),客户端A和B都连接到注册表。

客户端A通过注册表获取对B上导出对象的引用,并调用一个方法 - 该方法调用是否通过注册表?即如果A将大字节数组传递给B作为方法调用的参数,那么通过R需要2跳,还是注册表告诉A可以直接与B通信?

回答

2

不,从客户端到服务器的调用不通过RMI注册表。注册表仅用于查找对服务器的引用。随后对服务器的调用直接到达那里。

RMI注册表实际上只不过是一个RMI服务器本身,它接受并存储了注册服务器的远程存根。它为不知道在哪里找到服务器的客户提供了一个已知的入口点。它将RMI存根交给客户端,然后客户端通过该存根直接与服务器通信。

+0

我认为会是这样,谢谢。出于兴趣,当你使用“服务器”这个词时,你指的是什么?一个使用LocateRegistry.getRegistry(主机名)但是绑定UnicastRemoteObject实例的客户端 - 是否构成“服务器”? – gubby

+0

@jgubby:是的,这就是我的意思。对不起,客户服务器在RMI中是一个相当有问题的术语。 – skaffman

+0

@jgubby任何导出的远程对象都是一个服务器。整个Java进程可以充当RMI客户端,服务器或两者。 – EJP