2015-05-02 120 views
1

我正在阅读几个与Java RMI相关的教程(其中一个here),我发现自己很难理解RMI服务器。Java RMI服务器在哪里监听?

我启动一个Java Main程序,然后创建一个UnicastRemoteObject,然后在RMI注册表服务器中绑定对象(按照教程)。之后,Java Main程序在绑定后退出。

UnicastRemoteObject的父类是RemoteServer,我假定我创建的每个远程对象(也是UnicastRemoteObject)都是监听一个匿名端口的Java进程(JVM)。

那么如果我有10个远程对象,那么我有10个端口被占用来服务客户端远程调用?这听起来不对,但我无法真正找到实际建立的RMI服务器在哪里以及它将占用多少端口以用于远程客户端调用?

任何人都可以详细解释这件事情是如何工作的?

+0

如果需要,可以使用显式端口创建[UnicastRemoteObject](http://docs.oracle.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject.html)。否则它会随机为你选择一个。除端口外,您还将公开RMI [注册表](http://docs.oracle.com/javase/8/docs/api/java/rmi/registry/Registry.html)端口,默认端口为1099。 –

+0

@EdwinDalorzo是否可以在同一个端口上创建我的所有'RemoteObject'?所以我不需要为每个'RemoteOjbect'使用这么多端口? – GMsoF

+0

嗯,我不完全是RMI的专家,但我认为每个UnicastRemote对象都会打开一个套接字,所以我怀疑你可以为不同的对象重用相同的端口。但我想你可以试着证明我的理论。 –

回答

2

我启动一个Java Main程序,然后创建一个UnicastRemoteObject,然后在RMI注册表服务器中绑定对象(按照教程)。之后,Java Main程序在绑定后退出。

不,它不会。只要远程对象保持导出状态,它将保持活动状态。

UnicastRemoteObject的父类是RemoteServer,我假设我创建的每个远程对象(也是UnicastRemoteObject)都是侦听一个匿名端口的Java进程(JVM)。

不是。它是当前JVM中存在的一个Java对象。不是一个单独的过程。

因此,如果我有10个远程对象,那么我有10个端口占用服务客户端远程调用?

不需要,除非你指定一个端口,否则你会得到一个系统分配的端口。通常,端口将在您从此JVM导出的所有远程对象之间共享。

这不健全的权利

它不是。

但我真的找不到实际建立的RMI服务器在哪里以及它将占用多少端口以用于远程客户端调用?

它深入RMI实现类中。

+1

在这里应该有一个基于[rmi]标记的基于问题的机制: - 作者命名的'EJP'给出的答案肯定是100%正确的,必须自动提升两次,因为我看到很多答案不是即使获得分数,但他们显然是正确的和最好的。我是你的忠实粉丝... –

+0

@shekharsuman谢谢。 – EJP