最佳Java支持的服务器/客户端协议?

问题描述:

我正在编写一个客户机/服务器应用程序,它应该基于消息工作。我希望尽可能地重复使用,而不是写另一个实现,并好奇别人正在使用什么。最佳Java支持的服务器/客户端协议?

特点图书馆应提供:

  • 客户端和服务器端功能
  • 应该工作基于消息的
  • 支持多线程的背后负载平衡器
  • 应该工作/防火墙

我用HTTPCore做了几个测试,但底线是必须实现客户端和服务器,只有传输层才会被覆盖。由于网络相关的要求,RMI不是一种选择。

任何想法,高度赞赏。


详细

我的想法是实现其处理客户端通信的客户端/服务器的包装(包括用户名/密码验证),并传入的请求JMS队列中写道:

#1 User --> Wrapper (Check for user/password) --> JMS --> "Server" 
#2 User polls Wrapper which polls JMS 

单独的进程将处理请求,并可以通过包装器回复客户端。我想使用JMS,因为:

  • 它处理持久性不错
  • 负载均衡 - 这很容易通过增加额外的服务器作为消费者来处理高峰
  • JMSTimeToLive派上用场太

不幸的是,我没有看到自己使用JMS的方法,因为客户端应该只能访问他们的消息,并且在JMS端安装不同的用户听起来也不可行。

那么,HTTP可能是实现它的客户端和服务器代码方面最好的支持 - 但根据您的要求它可能完全不合适。我们需要实际上请参阅一些要求(或者至少对应用程序是什么样的模糊概念),然后才能真正为您提供建议。

我想说最好的支持,如果不是最好的实现,Java的客户端/服务器通信包是Sun的RMI(远程方法调用)。它包含在标准的Java类库中,即使它不是最快的选项,也能完成工作。当然,它是由Sun支持的。几年前,我实现了一个基于回合的游戏框架,并且非常稳定。

我们正在标准化Adobe的AMF,因为我们在客户端和Java6/Tomcat6/BlazeDS/Spring-Framework2.5/iBATIS2.3.4/ActiveMQ-JMS5.2中使用Adobe Flex/AIR, -tier堆栈(Oracle 10g后端)。因为我们正在对Flex客户端开发进行标准化,所以AMF和BlazeDS(现在更好地结合到Spring,这要感谢Adobe和SpringSource在集成上进行合作),这是我们可以使用的最有效和最方便的方式来与服务器端。

我们还大量建立在数据中心的JMS消息 - BlazeDS的,使我们能够弥补我们的Flex客户端的JMS主题订阅。这是非常强大和有效的。

我们的Flex .swf文件的Java .class代码被捆绑到了部署的同一.jar文件。这样,客户端代码的正确版本将被部署到与处理客户端服务调用(或消息传递操作)的相应中间层java代码进行交互。这一直是客户端 - 服务器计算的祸根 - 确保各层的正确版本彼此连接。我们用我们特定的打包和部署方法有效地解决了这个古老的问题。

我们所有的客户机 - 服务器交互工作在HTTP/HTTPS端口80和443,即使在服务器端消息推动,我们与桥接我们ActiveMQ的JMS消息代理BlazeDS的事。

RMI很适合我们。有一些限制,例如无法直接连接到该计算机(如果客户端位于防火墙后面不起作用),则无法向客户端回叫。您还可以轻松地将通信封装到SSL中,或者通过可以封装在SSL中的HTTP进行隧道传输。

如果你最终使用这个记得总是设置分配给客户端类串行版本。您可以在创建它时将其设置为1L,或者如果客户端已经有该类使用serialver.exe来发现现有的类的序列。否则,只要您更改或添加公共方法或与现有客户端的变量兼容性就会中断。

静态最后的serialVersionUID长= 1L

编辑:即进入服务器的每个RMI请求获得了它自己的线程。你不必自己处理。

编辑:我想稍后在问题中添加一些细节。您可以通过HTTP传输RMI,然后您可以使用负载均衡器。

我最近开始玩Hessian,它显示了很多的承诺。它本身使用HTTP,它比RMI over HTTP更简单,它是一个二进制协议,这意味着它比所有基于XML的协议都快。得到Hessian很容易。我最近通过在我们的应用中嵌入Jetty来完成这项工作,配置Hessian Servlet并使其实现我们的API接口。关于Hessian的伟大之处在于它的简单性......就像JMS或HTTP上的RMI一样。在其他语言中也有用于Hessian的库。

它难以使基于给出的信息,但有可能使用TemporaryQueues的例如一个建议以每个客户端为基础动态创建PTP目标可能适合问题?

Here是一个合理的概述。

+0

嗨吉姆,哪些信息是我想念的补充? Tkx链接到这篇文章很遗憾,不幸的是TemporaryQueues的方法不起作用,因为它至少需要一个静态队列。 “坏人”很容易在那里访问消息并滥用临时队列。 – MrG 2009-01-16 17:14:36

你有没有试过RMICORBA?与他们两个可以distribute your logic和创建会话

使用Spring ....然后挑选的协议。