如果我想在我的RMI应用程序中启用“双向”通信(即,允许服务器调用客户端上的方法,以及客户端调用服务器上的方法),这是最简单的方法客户端也进入Remote类?
此外,如果我打算将我的客户端实例作为方法参数传递给服务器,我认为没有必要将“客户端类”添加到rmiregistry吗?
最后一个问题,我的所有课程是否仍然需要在同一个地方编译? I.E我可以在两台完全独立的机器上编译服务器和客户端,并希望它们能够正常通信吗?
*编辑**
还有一个问题,我的问题引用了我的客户端界面(IClient):它有一个arraylist(所以我有ArrayList<IClient>
)来存储客户端的新实例,以便服务器可以跟踪已注册的客户端。当我尝试在不同的机器上编译服务器时,它抱怨它无法找到IClient - 显然,因为IClient在客户机上。我该如何解决这个问题?
答案 0 :(得分:3)
你的所有假设都是正确的。
您不必将可远程调用的客户端类添加到rmi注册表中,但仍需要将其导出。
编译的唯一警告是它们必须使用相同的编译器设置(至少那些影响RMI存根生成的版本)使用相同版本的java。
答案 1 :(得分:3)
如果您在将来的部署中有任何要求客户端或服务器将位于防火墙后面,请远离RMI。你在找麻烦。 特别是如果您希望服务器呼叫客户端。
以下是两种适用于我们的替代解决方案:
让客户端调用服务器,服务器阻止调用,直到客户端可以获得数据。这会占用每个客户端的一个线程(如果你不使用NIO),但很容易实现。 偶尔返回null,以防止来自客户端的长时间运行呼叫被防火墙关闭(当然,取决于防火墙配置)
如果你想要使用漂亮的java接口,可以考虑一个非常轻量级的Hessian,在HTTP之上运行,而不用担心RMI注册表或类似的东西
< / LI>如果您打算向其他客户端开放服务器端,Hessian仍然是一个不错的选择,但如果需要进行扩展,请考虑RESTful架构风格。
答案 2 :(得分:0)
重新提出你的最后一个问题,远程接口类及它们所依赖的所有类等等,直到两个主机上都必须存在闭包。