Google Wave中的实时打字是如何工作的?

34
我相信Wave不会每毫秒轮询服务器以查找其他用户是否有输入内容...那么我该如何实时看到其他人的输入内容?而且还要确保不会占用太多带宽。

这里有一个答案中提供了一些信息:https://dev59.com/oUfSa4cB1Zd3GeqPAMtY - Greg Leaver
9个回答

38

持久化HTTP,Comet

保持HTTP连接活跃并在键入字符时发送字符

*2014年修订:另外,请查看WebSocket和HTTP/1.1 Upgrade header。浏览器在2010年左右开始实现这个功能,因此我将其添加到原始答案中。


它真的使用Comet吗?因为它使用GWT? - Rahul Garg
5
彗星是一个流行词,它不是任何定义好的框架或技术。您可以使用 GWT 或不使用 GWT 以任何您喜欢的方式实现它。 - Yoni Roit

6

不知道用户有这样的限制!我会给你投票,以增加你的声望。 - Rich Bradshaw
感谢您的投票,我现在已经编辑了我的答案,包括“多个超链接”,因此实际上链接到IETF草案。 - Thomas Broyer

4

GWT中的服务器推送

服务器推送是一种等待、响应、关闭、重新打开的范式:

  • 等待: 当GWT代码调用您的服务器请求某些尚未拥有的数据时,冻结(等待)

  • 响应: 一旦所请求的数据可用,立即响应

  • 关闭: 然后关闭连接。

  • 重新打开: 一旦您的GWT代码接收到响应,立即打开一个新的连接来查询下一个事件。


3

查看视频,在第55分钟左右(接近结尾)Google Wave: Powered by GWT

问:您如何实现持久连接,长时间的HTTP连接?

答:未来计划是使用HTML5 Web Sockets。长期来看,这是我们目前正在使用的技术。

问:是否有平台或库可以下载并进行测试?

答:不确定。我认为没有。

附言:这就是他说的话。对我来说,它并没有太多意义(“未来计划”与“目前正在使用”之间的矛盾)。任何以英语为母语的人都可能想验证我是否正确地记录了它?


3
有点脱离上下文,容易让人感到困惑。这句话的意思基本上是:是的,我们正在使用挂起请求(也称为“Comet”)。未来计划是在可用的情况下转移到WebSockets。请注意不要改变原意,并将其简化易懂。 - Mark Renouf

1

WebSockets的整个目的是让浏览器保持与服务器的双向套接字打开,以便可以使用实时通信。当有人在另一端(如Wave客户端)输入时,它会触发一个事件,该事件被发送到服务器,服务器会查看谁还应该接收该事件并将其传递给它们,例如输入的字母。

WebSocket和Comet是不同的。

格兰维尔


1
纯属猜测,但它是否使用了 HTML 5 规范中的 服务器端 DOM 事件呢?

0

我花了一些时间反向工程Google Wave客户端代码(无耻地插入http://antimatter15.com/misc/read/,这是一个只读的公共客户端,适用于所有公共Wave,无需机器人或小工具,在Google没有推出升级时非常有用)。

总之,Google使用GWT框架和Google Closure库的某些方面(实际上是开源和文档化的),并且他们使用goog.net.BrowserChannel库,从注释中可以看出它也用于Gmail内的聊天功能。

http://closure-library.googlecode.com/svn/docs/closure_goog_net_browserchannel.js.html


0

现在可能使用的是comet,将来可以尝试使用websocket。因为它能够在Firefox 3.5中运行,并且据我所读,websocket仅在Firefox的夜间版本中可用...但我可能是错的...因为似乎在IE中根本无法工作。


-1

我会假设他们使用ajax请求。执行XMLHttpRequest,它是异步的,当服务器有数据要发送给您的浏览器时,注册的javascript回调函数获取数据并进行任何操作。因此,基本上浏览器请求下一个事件,处理它,无限重复。


XMLHttpRequest只发送一次请求,如果没有收到响应,连接就会终止。此后不会有任何等待。这就是“comet”技术所做的事情,它使用非无限的GET请求。可以在维基百科上了解更多相关信息。 - holms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接