RMI 服务器如何响应多个 RMI 客户端调用?

Posted

技术标签:

【中文标题】RMI 服务器如何响应多个 RMI 客户端调用?【英文标题】:How does RMI server responds to multiple RMI client call? 【发布时间】:2015-08-06 09:25:51 【问题描述】:

我已经构建了一个基于文件下载器 RMI 客户端-服务器的应用程序。在那方面,我不了解不同客户的工作方式。这些文件位于服务器端,RMI 在其端有等效的代理服务器(称为存根)。我为此应用程序使用了 10 个客户端和 1 个服务器。

问题 1- 我的问题是当多个客户端同时调用 RMI 从注册表查找后,客户端种子/提供的顺序是什么 他们的文件?表示底层服务算法---Is it Round Robin Algorithm OR FIFO algorithm OR some other?

我无法弄清楚这一点,当我执行我的代码时,我只是看到各个文件正在同时下载,就好像文件正在被复制而不是下载一样。

问题 2- 单台服务器如何服务这么多客户? 文件同时下载的顺序是什么?

另外,我的服务器端方法没有同步,不需要同步!

【问题讨论】:

为什么下载和复制不一样? @dotvav- 主要问题是 q1。一次服务这么多客户使用什么服务算法?请回答。 据我所知,每个请求都会创建一个新线程,并为客户端连接使用一个新的服务器端口。这可以通过在服务器代码中添加断点、在调试器中运行并启动多个客户端调用来验证。 @dotvav- 我对 RMI 了解不多,因此,我正在等待更简洁的答案。不过感谢您的帮助,如果您能写出同样的答案,请也这样做。 @EJP 谢谢你的纠正,我期待你会回答这个问题:) 【参考方案1】:

问题 1- 我的问题是,当多个客户端在从注册表查找后同时进行 RMI 调用时,客户端以什么顺序播种/提供文件?

没有顺序。它们都同时进行。

表示底层服务算法---是轮询算法

没有。

OR FIFO 算法

没有。

还是其他?

没有。没有排序。

我无法弄清楚这一点,当我执行我的代码时,我只是看到各个文件正在同时下载,就好像文件正在被复制而不是下载一样。

我不知道“复制而不是下载”是什么意思,但“同时”准确地描述了这种情况。

问题 2- 单个服务器如何为这么多客户端提供服务以及以什么顺序同时下载文件?

通过多线程,或熟练使用多路复用 I/O 或异步 I/O。它没有指定。没有指定任何内容。你不能假设的一件事是它是单线程的并且以任何方式顺序化。

另外,我的服务器端方法没有同步,不需要同步!

另一个假设,又完全无效。 RMI 规范中没有任何内容可以证明这种信念是正确的。您不能假设 RMI 远程对象是单线程的。

【讨论】:

必须有一些算法来指导服务器端的下载过程!在我的问题中,文件复制意味着在同一台机器上复制,而下载意味着从不同机器(即服务器)下载文件。请告诉我,如果没有指定,那么它是如何工作的。 RMI 的内部代码可能使用了某种技术,这些技术必须在所有平台上保持不变,因为它是 Java。请回答并感谢您的详细回答。 而且,我相信多路复用 IO 几乎类似于 Round Robin。意味着,一次一个,在服务器端切换一小段时间后,所有文件都被提供,直到文件被下载。 @asad 你做了几个完全没有根据的假设。就好像 RMI 服务器是自动多线程的一样继续进行,您就不会出错。你自己的观察证实了这一点。没有“算法”或“循环”或“一次一个”或“时间切换令牌”(无论这意味着什么)。 @shekharsuman 您不知道他使用的是什么操作系统,因此您无法断言它是如何进行调度的。考虑一个先发制人的实时操作系统。 asad 的问题是关于 RMI,而不是操作系统:请参阅标签。除非规范中有规定特定行为的措辞,否则无法通过引用任何实现来回答该问题:相反,规范中的措辞故意尽可能含糊:“不保证”。任何关于算法的假设或声明都是无效的,并且与规范相矛盾。 @EJP-感谢 EJP 并感谢 Shekhar 澄清所有疑虑。我的实际意思是,如果多路复用 IO 与 OS 调度中使用的称为 Round-Robin 算法的算法相同。 Shekhar 已经理解了这个类比。但是,这个简洁的答案消除了我的疑问。另外,最后一个问题只是我所说的一点,而不是您回答的问题。再次感谢 EJP...

以上是关于RMI 服务器如何响应多个 RMI 客户端调用?的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记之RMI远程方法调用

RMI远程方法调用

服务器如何与 RMI 中的客户端建立会话

RMI如何实现轮询机制?

RMI 远程方法调用

RMI : 确定远程对象的 IP 地址