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

时间:2014-09-27 10:48:26

标签: java rmi rpc

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

(1)在Server代码中,是registry.bind(" Hello",stub);拦截电话? 我想最终使我的程序点对点,所以我需要我的服务器在导出接口后继续。导出界面后,有没有办法在我的服务器主中继续执行?

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

..
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 {}块中返回一些东西,以免得到编译错误。这似乎在逻辑上是错误的。

我可以反过来说 - 在客户端我收到异常是服务器崩溃所以我的远程方法无法返回,但在这里我需要在服务器中检测客户端是否在服务器中的远程方法返回之前已经死亡。 / p>

1 个答案:

答案 0 :(得分:2)

  

(1)在Server代码中,是registry.bind(" Hello",stub);拦截电话?我想最终使我的程序点对点,所以我需要我的服务器在导出接口后继续。导出界面后,有没有办法在我的服务器主中继续执行?

它在调用期间是阻塞的,但所有调用必须要做的就是HashMap.add(),并进行一些错误检查。在accept()的意义上,当外部事件发生时,它不会阻止代码继续执行。

  

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

没有。 RMI框架可以在您的return语句执行后检测并处理该案例,但您不会被告知。它将记录问题并关闭连接。

  

我需要在服务器中检测客户端在服务器中的远程方法返回之前是否已经死亡。

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