2011-11-13 61 views
1

我得到了一个使用GWTP(涉及MVP分离,杜松子酒和调度)的项目,现在我需要将服务器上的更改推送给特定客户端的情况使用GWTP实现服务器推送

我读过gwt-comet和gwteventservice文档,看来第一个不能用RPC和第二个Ecnapsulates RPC,为此我不知道如何使它适合我当前的来自GWTP的命令模式。想法?

回答

3

我一直在使用gwt-comet(http://code.google.com/p/gwt-comet/)。这是一个像RPC一样工作得很好的本地彗星实现,你也可以发送字符串或你的GWT序列化对象。最好的事情是,你不需要做很多事情就可以实现它。

0

这实际上是一个servlet问题,而不是GWT或GWTP问题。

所以有几种方法可以做到这一点,最稳定的(在我看来)是有一个长或阻塞的轮询servlet。这基本上是一个由客户端轮询的servlet,如果没有消息“推送”给客户端,并且如果过了很多时间(这是为了解决http超时问题),那么持续打开连接一段时间。心跳会返回某种类型。无论哪种方式,当servlet请求请求返回时,客户端只是发出另一个请求。这是我认为最便携和稳定的方式,因为它只使用核心servlet api,不会遇到网络问题,并且阻止部分允许您在服务器上持续一段时间并且减少总的请求负载,同时允许在有一些可用的情况下将新信息快速返回给客户端。

实现这一目标的下一个方法是通过WebSockets,一旦你得到它的工作,这是伟大的,我认为这是未来的方式毫无疑问。我认为这是一个很好的工作方式,因为在我看来,一旦网络应用产生了一定的影响,就会发生模式转变,所以我们都需要加快速度。基本上,你有一个通过端口80打开的javascript套接字(这是最好的功能之一,因为你不必打开任何防火墙漏洞),并且可以通过该套接字在两个方向上进行通信。

彗星也可以工作,但它通常会将您锁定到一个服务器类型,这可能适合您的应用程序。注意这里!!!!我只用彗星进行了非常小的测试,当我设置它时它对我来说很脆弱,并且没有像我设置了的阻塞民意解决方案那样稳定。

在我看来,现在最新的一个,但这个是非常有限的,由于网络限制可能单域内部网应用程序,是使用基于小程序的推送。这个设置(可以使用udp或者一个直接的套接字来完成,我在所有的web上只是为了让它在概念上更简单)采用applet,使用它在客户端上启动jetty服务器实例,然后让页面发布客户端的码头'端点'到服务器。此时,客户端可以使用servlet与服务器联系,服务器可以通过Jetty服务器上暴露的servlet与客户端联系。这是真正的推动,它是neato,但有网络恶梦。

因此,我使用长轮询,留意网络套接字,因为它们是我心目中的未来,并且非常喜欢基于小应用程序的版本,尽管由于网络分辨率限制,它的使用受到限制。

一旦你决定了,从GWTP开始,你只需要有动作或者JSNI桥接方法来连接你的服务器并接收响应。我不会介绍这个,因为这实际上是一个核心的servlet/http/javascript问题,而不是以GWT或GWTP为中心的问题。

我希望有帮助!