的Java RMI - 使客户端服务器
如果我想启用“双向”沟通在我的RMI应用程序(即,允许服务器调用客户端上的方法,以及客户端调用服务器上的方法)是使客户端成为Remote类的最简单方法吗?的Java RMI - 使客户端服务器
另外,如果我打算给我的客户的情况下,传递到服务器作为方法的参数,我是正确的思维,没有必要添加了“客户端类”到rmiregistry?
而最后一个问题,做我的课还需要在同一个地方进行编译? I.E我可以在两个完全独立的机器上编译服务器和客户机,并期望它们能正确通信吗?
*编辑**
还有一个问题,我的问题提到了我的客户端界面(IClient):它有一个ArrayList(所以我必须ArrayList<IClient>
)存储客户端的新实例,使服务器可以跟踪注册客户。当我尝试在另一台机器上编译服务器时,它抱怨它无法找到IClient - 显然,IClient位于客户机上。我如何解决这个问题?
你对所有的假设都是正确的。
您不必你可远程调用客户端类添加到RMI注册表,但你还是要出口。
与汇编唯一需要注意的是,它们必须具有相同版本的Java使用相同的编译器设置(至少那些影响RMI存根代)来完成。
如果你有一个客户端或服务器将在未来部署在防火墙后面的任何要求,从RMI望而却步。你在问问题。 特别是如果你想让服务器调用客户端。
这里有两个备选解决方案为我们运作良好:
在客户端调用与服务器阻塞调用服务器,直到数据可用于客户端。这会为每个客户端使用一个线程(如果您不使用NIO),但很容易实现。 在一段时间返回NULL一次,以防止来自客户端的长时间运行的调用防火墙被关闭(取决于防火墙的配置,当然)
,如果你想很好的Java接口一起玩,考虑Hessian这是非常轻量级的,运行在HTTP之上,并且不会打扰RMI注册表或类似的东西
如果您打算将服务器端打开到其他客户端,Hessian仍然是一个不错的选择,但如果缩放out是一个问题,看看RESTful架构风格。
回复您的最后一个问题,远程接口类,他们依赖于等递归直到关闭所有的类都必须存在两个主机上。
你不应该使用rmi存根,他们已经不需要多年了。并且在大多数情况下,jdk 5和6将在RMI上进行通信(在jdk 6的一个发布版本中存在一些问题,但它们是固定的)。 – jtahlborn 2011-01-26 21:44:11
@jtahlborn感谢您的纠正,我最后一次使用RMI的确是低于1。4,但重点只是以类似的方式编译它们。 – biziclop 2011-01-26 21:51:21