gpt4 book ai didi

java - 使用单个端口的 RMI 回调

转载 作者:行者123 更新时间:2023-12-02 07:25:08 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

关于java - 使用单个端口的 RMI 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com