GMail聊天如何在没有客户端交互的情况下进行AJAX请求?

59

所有HTTP响应都需要客户端发起请求,即使是使用AJAX进行的请求也不例外。但是,即使我只是坐在电脑椅子上观看而没有与浏览器进行交互,Gmail的聊天功能也能够接收来自其他用户的消息。他们是如何做到的呢?


8
Gmail使用什么类型的AJAX轮询策略来实现聊天客户端? - Jimmy
哇,你几乎重新写了这个问题。 - Pablo Fernandez
@Pablo:是的...我相当确定这就是他所问的,但在我回答之前他还没有想清楚,所以我想在其他人犯同样错误之前把它澄清。 - Shog9
@Pablo:是的,他确实重写了问题。在原始帖子中根本没有意义。 - Samuel
这个 Comet 的东西听起来像是正确的答案,但我也做过一些类似的事情,就是用 jQuery 循环不断地检查服务器是否有更新,比如聊天更新。不需要用户干预。不过看起来已经有现成的技术可以实现这个,没必要重复发明。 - Tim
3个回答

42

这种技术被称为“Comet”,也被称为“服务器推送”、“反向Ajax”等。

它是关于从服务器向浏览器推送数据,保持HTTP连接的活动状态。在维基百科文章英文版本)中可以找到更多信息。

此外,这里还有一份来自DWR的Joe Walker的相当不错的演示文稿,其中他谈到了Comet。


你知道 Gmail 使用哪种方法吗?是隐藏的 IFrame,还是 XMLHttpRequest? - chat
也许可以链接到英文版的维基百科吗? - Frank Crook
@Frank 抱歉!我的语言环境出了问题:D,感谢Jon的纠正,下次我会再仔细检查。 - Pablo Fernandez
1
我有一段时间没有关注过彗星(comet)了,不过上次我研究它的时候发现问题是Apache不能同时保持那么多连接。因此,如果你想要实现彗星技术,你需要更多的服务器,这会比你原本所需的更多。 - thirsty93
1
在上面链接的演示中,作者提到在apache2开发时期,Comet技术还不是那么出名,因此它的支持相对较弱。我相信如果Comet技术得到更多普及,下一个版本的支持将会得到改善。 - Pablo Fernandez
1
@RexM:如果在这里记录下来,对于每个人来说都会更方便。 - Brian MacKay

8

正如您所指出的那样,HTTP要求客户端“拉取”数据。 Gmail可以使用定时器触发HTTP操作来从服务器“拉取”数据,而不需要用户点击某个东西。因此,它可能看起来是自动的,但仍然是客户端启动的。


1
据我所知,他们使用了Comet。这不是客户端请求。 - Pablo Fernandez
1
我明白了。今天学到了新知识。谢谢! - sybreon
7
据我所知,Comet仍然是客户端发起的,只是服务器会保持连接处于打开状态,直到有有趣的内容要返回给客户端,而不是立即返回响应。 - Jon Skeet
1
阅读维基百科文章后,可以很清楚地看到,在所有当前的实现中,客户端都会发起连接。说实话,很难想象还有其他方式可以工作。 - Jon Skeet
1
我猜这取决于它如何被看待。在TCP层面上,它绝对是客户端拉取。然而,在应用层面上,情况就不同了。如果它发送了一些触发客户端JavaScript的内容,那么它仍然是客户端拉取吗?如果它立即发送另一个触发器,它仍然是客户端拉取吗? - sybreon

5

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