如何将RMI使用的总端口数从N(其中N = RMI UnicastRemoteObjects的数量)减少到2 + N?
请允许我进一步解释。我有一个使用RMI执行客户端 - 服务器通信的系统。有两个接口;我们称它们为客户端和服务器以保持简单。 RMI注册表在与服务器相同的JVM中运行,并绑定到某个端口(例如4000)。服务器导出为没有端口号的UnicastRemoteObject,并根据no-args构造函数绑定到匿名端口。
当客户端启动时,它会调用Server实现上的void hello(客户端客户端)方法,该方法是从注册表中的查找获得的。传入的客户端实现也是UnicastRemoteObject;通过两个接口为客户端和服务器之间提供双向通信。问题是客户端中的UnicastRemoteObject也在监听自己的匿名端口。
这意味着为了拥有N个客户端,我需要有1 + 1 + 3 * N个端口; 2 + N正在收听,其中2 * N是短暂的。 (注册表+服务器实例+每个客户端一个侦听端口,每个客户端的临时端口,每个服务器的临时端口)。我们通常有大约30个客户端,提供92个端口。我相信我可以将它降低到32个端口(1 + 1 +每个客户端的临时端口),但我看不出如何使用纯RMI。
我愿意接受其他不需要RMI的解决方案,但也不要求我们重新编写接口。
答案 0 :(得分:2)
我不清楚这里的问题是什么。默认情况下,导出的RMI对象将共享相同的端口号,除非您编写了不兼容的服务器套接字工厂。您可以指定在构造或导出它们时使用的端口号,如UnicastRemoteObject
的Javadoc中所述。在JVM中启动后者时,可以为对象和注册表使用相同的端口。您的92个端口作为资源计数没有多大意义,即使它们是准确的,因为它们分布在所有服务器和客户端主机上。