GMail Chat 如何能够在没有客户端交互的情况下发出 AJAX 请求?

Posted

技术标签:

【中文标题】GMail Chat 如何能够在没有客户端交互的情况下发出 AJAX 请求?【英文标题】:How is GMail Chat able to make AJAX requests without client interaction? 【发布时间】:2010-10-18 11:26:43 【问题描述】:

所有 HTTP 响应都需要客户端启动它们,即使是使用 AJAX 做出的响应。但是 GMail 的聊天功能能够接收来自其他用户的消息,即使我只是坐在舒适的电脑椅上观看但不与浏览器交互。他们是怎么做到的?

【问题讨论】:

问题劫持:Gmail 使用什么样的 AJAX 轮询策略来实现聊天客户端? 哇,你几乎重写了这个问题。 @Pablo: 是的......很确定这是他要问的,但直到我已经回答了才弄清楚,所以我想在别人之前清理它犯了同样的错误。 @Pablo:是的,他确实重写了这个问题。在原始帖子中它是零意义的。 这个 Comet thingy 听起来像是正确的答案,但我也做了一些 jQuery 循环不断检查服务器更新的事情,比如聊天更新。无需用户干预。似乎仍然有现有的技术,不值得重新发明。 【参考方案1】:

该技术被称为“彗星”,也称为“服务器推送”、“反向 ajax”等。

这是关于将数据从服务器推送到浏览器,保持 http 连接处于活动状态。在wikipedia article (English version) 上查找更多信息。

这里还有一个pretty good presentation,来自 DWR 的 Joe Walker,他在那里谈论彗星。

【讨论】:

您知道 Gmail 使用哪种方法吗?隐藏的 IFrame、XMLHttpRequest? 也许链接到英文版的***? 我有一阵子没看过彗星了,但上次我研究它时,问题是 apache 真的无法同时打开那么多连接。因此,如果您要实现 comet,您将需要比其他方式更多的服务器。 @thirsty 在上面链接的演示文稿中,作者指出,当 apache2 正在开发时,comet 并不为人所知,因此它的支持很差。如果彗星缓存更多,我相信这将在下一个版本中得到改善。 @RexM:如果把它记录在这里让大家的生活更轻松就好了。【参考方案2】:

正如您正确指出的,HTTP 要求客户端“拉取”数据。 Gmail 仍然可以通过使用计时器来触发 HTTP 操作而不是要求用户单击某些内容,从而从服务器“提取”数据。所以,它可能看起来是自动的,但它仍然是客户端启动的。

【讨论】:

我听说他们使用彗星。这不是客户请求 AFAIK 我明白了。今天学到了新东西。谢谢! Comet 仍然是客户端启动的 AFAIK - 只是服务器保持连接打开,直到它有有趣的事情要说,而不是立即返回响应。 确实阅读了***文章,很明显对于所有当前的实现,客户端启动连接。老实说,很难看出它还能如何工作。 我想这取决于如何看待它。在 TCP 层,肯定是客户端拉取。但是,在应用层,这取决于。如果它发送的东西会触发客户端中的 javascript,它仍然是客户端拉动吗?如果它立即发送另一个触发器,它仍然是客户端拉动吗?【参考方案3】:

是的,彗星是正确的。 Google Web Toolkit Applications by Ryan Dewsbury 在第 9 章中解释了如何创建基于 Comets 的 Instant Messenger 应用程序。

【讨论】:

以上是关于GMail Chat 如何能够在没有客户端交互的情况下发出 AJAX 请求?的主要内容,如果未能解决你的问题,请参考以下文章

有没有在 gmail 中显示 svg 图像的技巧?

使用 android 直接连接到 GMAIL [重复]

Gmail NodeJs客户端中的Gmail API userId用例?

Boost Asio,聊天示例:如何在消息正文中手动写入? [chat_message.hpp]

如何在没有手动浏览器身份验证的情况下从 Meteor.js 应用程序对 GMail-api 进行 oauth (2) 身份验证?

关于ppp拨号gprs上网的一些问题