我得到了一个使用GWTP的项目(涉及MVP分离,Gin和Dispatch),现在我的情况是需要将服务器上的更改推送到特定的客户端
我已经阅读了gwt-comet和gwteventservice文档,似乎第一个不能与RPC一起工作,第二个封装RPC,我不知道如何将其适合我当前的GWTP命令模式。想法吗?
我一直在使用gwt-comet (http://code.google.com/p/gwt-comet/)。它是一个像RPC一样工作得很好的原生comet实现,您也可以发送字符串或gwt序列化的对象。最好的事情是,你不需要做很多事情就能让它起作用。
我使用了这里描述的"Server Push in GWT" http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ -对于一个小项目来说,它似乎工作得相当好。
这实际上是servlet问题,而不是GWT或GWTP问题。
所以有几种方法可以做到这一点,最稳定的(在我看来)是有一个长或阻塞轮询servlet。这基本上是一个由客户端轮询的servlet,如果没有消息要"推送"到客户端,并且如果时间过长(这是为了绕过http超时),则保持连接打开一段时间,并返回某种心跳。无论哪种方式,当servlet请求请求返回时,客户机只是发出另一个请求。在我看来,这是最可移植和稳定的方式,因为它只使用核心servlet api,不会受到网络问题的影响,并且阻塞部分允许您将民意调查"停放"在服务器上一段时间并减少总请求负载,同时允许在有一些可用时非常快速地将新信息返回给客户端。
实现这一目标的下一种方法是通过WebSockets,一旦你让它工作,这是伟大的,在我看来,毫无疑问是未来的方式。我认为这是一个很好的工作,因为在我看来,一旦它迎头赶上,这将是web应用程序的一个范式转变,所以我们都需要跟上速度。基本上,你有一个javascript '套接字'通过端口80打开(这是最好的功能之一,因为你不需要打开任何防火墙漏洞),可以在两个方向上通过套接字通信。
Comet也可以工作,但它通常会将您锁定为一种服务器类型,这可能适合您的应用程序。警告! !我只对comet做过非常小的测试,当我设置它时,它对我来说是片状的,并且不像我设置的阻塞投票解决方案那样稳定。
在我看来,最简洁的一种方法是使用基于applet的推送,但由于网络的限制,这种方法非常有限,可能仅限于单域内部网应用程序。这个设置(可以用udp或直接套接字完成,我做了所有web只是为了让它在概念上更简单)采用applet,使用它在客户端上启动一个jetty服务器实例,并让页面将客户端的jetty"端点"发布到服务器。此时,客户机可以使用它的servlet与服务器联系,而服务器可以通过jetty服务器上公开的servlet与客户机联系。这是真正的推动,它很简洁,但也有网络噩梦。
所以在所有这些中,我使用长轮询,关注web套接字,因为它们是我心中的未来,并且非常喜欢基于applet的版本,尽管由于网络分辨率的限制,它在使用上受到很大限制。
一旦您决定了这一点,从GWTP您将只需要操作或JSNI桥接方法来连接到您的服务器并接收响应。我不会深入讨论这个问题,因为这是一个核心的servlet/http/javascript问题,而不是GWT或GWTP中心问题。
我希望这对你有帮助!