gpt4 book ai didi

Java RMI -registry.bind 是否阻塞以及服务器如何知道客户端是否已关闭

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

我有 2 个关于在简单的 hello-world 客户端-服务器应用程序中使用 RMI 的 Java RMI 的独立问题,地址为 http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/hello/hello-world.html

(1) 在服务器代码中,是registry.bind("Hello", stub);阻塞调用?我希望最终使我的程序成为点对点,因此我需要我的服务器在导出接口(interface)后继续运行。导出接口(interface)后,有没有办法在我的服务器主服务器中继续执行?

(2) 在服务器上执行的远程方法中,我返回一个字符串。假设我的客户端在服务器上的远程方法想要返回之前崩溃了。我可以在我的服务器远程方法中检测到这一点吗?具体来说,这可以在远程方法中工作吗 -

..
try {
return str;
} catch (Exception e) {
System.err.println("Client seems to be down so cannot return"); return str;
}

以上大致是我想要实现的目标,并且异常似乎没有被触发:(a) 我需要抛出特定类型的异常吗? http://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/rmi/spec/rmi-exceptions.doc.html(b) 如果这可行,我仍然需要在 catch {} block 中返回一些内容以避免出现编译错误。这在逻辑上似乎是错误的。

我可以做相反的事情,即 - 在客户端中,我收到一个异常,即服务器崩溃,因此我的远程方法无法返回,但在这里我需要在服务器中检测客户端是否在服务器中的远程方法返回之前死亡。

最佳答案

(1) In the Server code, is the registry.bind("Hello", stub); a blocking-call ? I want to eventually make my program peer-to-peer so I would need my server to continue after exporting an interface. Is there a way to continue execution in my server main after I export my interface ?

它在调用期间处于阻塞状态,但所有调用本质上要做的就是 HashMap.add() 和一些错误检查。当外部发生某些事情时,它不会阻止其后的代码继续执行,就像accept()所做的那样。

(2) In my remote method executing on the server I return a String. Suppose my client crashes while just before the remote method on server wants to return. Can I detect this in my server remote method. Specifically can this work in the remote method

没有。 RMI 框架可能会在执行 return 语句后检测并处理这种情况,但不会告诉您这一点。它将记录问题并关闭连接。

I need to detect in the server if the client has died before the remote method in server returns.

你不能。 RMI 提供的了解消失客户端的唯一方法是 Unreferenced 接口(interface)。

关于Java RMI -registry.bind 是否阻塞以及服务器如何知道客户端是否已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26073855/

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