【问题标题】:RMI Callbacks using a single port使用单个端口的 RMI 回调
【发布时间】:2012-12-02 17:58:42
【问题描述】:

如何将 RMI 使用的总端口数从 N(其中 N = RMI UnicastRemoteObject 的数量)减少到 2 + N?

请允许我进一步解释。我有一个使用 RMI 执行客户端-服务器通信的系统。有两个接口;为了简单起见,我们将它们称为客户端和服务器。 RMI 注册表与服务器在同一个 JVM 中运行,并绑定到某个端口(例如 4000)。服务器导出为没有端口号的 UnicastRemoteObject,并根据 no-args 构造函数绑定到匿名端口。

当客户端启动时,它会在服务器实现上调用一个 void hello(客户端客户端) 方法,该方法是从注册表查找中获得的。传入的Client实现也是一个UnicastRemoteObject;通过两个接口为我们提供客户端和服务器之间的双向通信。问题是客户端中的 UnicastRemoteObject 也在监听自己的匿名端口。

这意味着为了拥有 N 个客户端,我需要有 1 + 1 + 3 * N 个可用端口;其中 2 + N 个正在监听,2 * N 个是临时的。 (注册表+服务器实例+每个客户端一个监听端口,每个客户端的临时端口,每个服务器的临时端口)。我们通常有大约 30 个客户端,提供 92 个端口。我相信我可以将其减少到 32 个端口(1 + 1 + 每个客户端的临时端口),但我不知道如何使用纯 RMI 来做到这一点。

我愿意接受其他不需要 RMI,但也不需要我们重新编写接口的解决方案。

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    我不清楚这里有什么问题。默认情况下,导出的 RMI 对象都将共享相同的端口号,除非您编写了不兼容的服务器套接字工厂。您可以在构造或导出它们时指定要使用的端口号,如UnicastRemoteObject 的Javadoc 中所述。在 JVM 中启动后者时,您可以为对象和注册表使用相同的端口。即使准确,您的 92 个端口作为资源计数也没有多大意义,因为它们分布在所有服务器和客户端主机上。

    【讨论】:

    • 我应该澄清一下,使用 92 个端口的原因是系统需要能够处理远程客户端,但对于 99% 的情况,客户端实际上会在同一台机器上运行。我不确定如果导出的对象在不同的​​虚拟机中运行,它们如何共享同一个端口?
    • @Andrew 因此,您需要一个用于所有远程对象(包括注册表)的侦听端口,以及一个用于与每个对象的出站连接的临时端口。对我来说听起来像是 1+N。
    • 一个监听所有远程对象的端口,所以一个用于注册中心,一个用于服务器,一个用于每个客户端。那是 2 + N。然后,您需要每个客户端到服务器的临时端口。那是另一个 N。您最终需要服务器到每个客户端的临时端口。那是另一个 N。所以 2 + N 个监听端口和 2 N 个临时端口。还是我遗漏了一些明显的东西?
    • 哦,是的。我把监听放在第一行......我的意思是整体端口。我很抱歉。
    • @Andrew 好吧,你不能。主要问题是短暂的出站端口,除了消除回调架构之外,您对它们无能为力。这就是 TCP 的工作原理。我的 Apache HTTPD、四个 Tomcat、OpenLDAP、MySQL 等之间使用了更多端口。为什么客户端已经在计算端口了?
    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 2011-03-05
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多