使用 GWTP 实现服务器推送

Posted

技术标签:

【中文标题】使用 GWTP 实现服务器推送【英文标题】:Implement server-push with GWTP 【发布时间】:2011-11-13 04:59:42 【问题描述】:

我有一个使用 GWTP 的项目(涉及 MVP 分离、Gin 和 Dispatch),现在我处于需要将服务器上的更改推送到特定客户端的情况

我已经阅读了 gwt-comet 和 gwteventservice 文档,似乎第一个不适用于 RPC,而第二个 Ecnapsulates RPC,我不知道如何在 GWTP 的当前命令模式中使用它。想法?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我使用了此处描述的“GWT 中的服务器推送”http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ - 对于一个小项目来说,它似乎工作得相当好。

【讨论】:

【参考方案3】:

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

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

实现这一目标的下一个方法是通过 WebSockets,一旦你让它工作,这非常棒,在我看来,这是毫无疑问的未来方式。我认为这是一个很好的合作,因为在我看来,一旦它抓住了潮流,这将是 Web 应用程序的范式转变,所以我们都需要跟上速度。基本上,您有一个通过端口 80 打开的 javascript“套接字”(这是最好的功能之一,因为您不必打开任何防火墙漏洞)并且可以通过该套接字在两个方向上进行通信。

Comet 也可以工作,但它通常会将您锁定为一种服务器类型,这对于您的应用程序来说可能没问题。在这里警告!!!!我只对 comet 进行了非常小的测试,当我设置它时它对我来说很不稳定,并且不像阻塞轮询解决方案那样稳定我设置它

现在我认为是最整洁的一个,但是由于网络限制,可能对单域 Intranet 应用程序非常有限,它是使用基于小程序的推送。这个设置(可以使用 udp 或直接套接字来完成,我做了所有的 web 只是为了在概念上保持简单)使用小程序,使用它在客户端上启动一个码头服务器实例,并让页面发布客户端的码头“端点”到服务器。此时,客户端可以使用它的 servlet 联系服务器,并且服务器可以通过码头服务器上暴露的 servlet 联系客户端。这是真正的推送,很整洁,但有网络噩梦。

因此,在上述所有内容中,我使用长轮询,密切关注网络套接字,因为它们是我心中的未来,并且非常喜欢基于小程序的版本,尽管由于网络分辨率限制,它的使用受到很大限制。

一旦您做出了决定,您就可以从 GWTP 获得所需的操作或 JSNI 桥接方法来连接到您的服务器并接收响应。我不会讨论这个,因为这实际上是一个核心 servlet/http/javascript 问题,而不是一个以 GWT 或 GWTP 为中心的问题。

希望对你有帮助!

【讨论】:

以上是关于使用 GWTP 实现服务器推送的主要内容,如果未能解决你的问题,请参考以下文章

服务器推送的实现—基于EventSource

使用 socket.io 技术实现消息实时推送

APNS推送Golang SDK使用Proxy代理

独立于移动设备平台的推送服务器的实现

如何实现消息推送功能

如何采用mqtt协议实现android消息推送