【问题标题】:How does Gmail do comet on Opera?Gmail 如何在 Opera 上做彗星?
【发布时间】:2011-02-09 02:10:03
【问题描述】:

我想知道 Gmail(或其他任何人)如何在 Opera 上使用彗星。

这是我迄今为止从实验中了解到的。

  1. 它不使用在 Opera 10.51 中损坏的 event-source 标签。
  2. 它不使用 iframe,它显示一个旋转的 throbber 和一个忙碌的鼠标光标。
  3. readyState = 3 时,它不会在 xmlhttprequest 上使用 responseText,这在 Opera 上是已知的。

我尝试在 mibbit 和 etherpad 中查看它是如何完成的,我发现它们都使用长轮询。

赏金

谁能告诉我一种比“事件源”更好的方法用于 Opera comet 流式传输,或者 gmail 如何进行流式传输(或者如果这样做,则进行长轮询)。

【问题讨论】:

    标签: javascript ajax gmail comet opera


    【解决方案1】:

    我真的不知道答案是什么。但我知道 Opera 支持服务器事件:http://my.opera.com/WebApplications/blog/show.dml/438711。也许这是朝着答案迈出的一步? 我也不确定,但我认为他们在 Opera Unite 中使用它。

    【讨论】:

    • 不,它不像我说的那样使用事件源。 Opera 10.51 中的事件源完全被破坏了,gmail 仍然可以正常传输 gchat。
    【解决方案2】:

    GMail 使用 BrowserChannel (Docs | Source),它包含在 Google 的 Closure Library 中。

    • @fileoverview BrowserChannel 类的定义。浏览器频道
    • 模拟 HTTP 上的双向套接字。它是基础
    • Gmail Chat IM 连接到服务器。

    【讨论】:

    • closure-library.googlecode.com/svn/docs/… 想想你真正要找的东西就在这里:closure-library.googlecode.com/svn/docs/… 搜索 pollResponse_ 和 getNextChunk_ :)
    • 你能再具体一点吗?我觉得我已经给予了足够慷慨的赏金来保证答案,而不仅仅是一个巨大的抽象图书馆的链接。
    • 好吧,我觉得应该留给 Jason,因为他给了 Closure 的原始指针,我只是更深入一点。看看那个源代码,它似乎使用了异步XMLHttpRequest 确实,超时负责轮询 responseText 并处理传入数据。当分块数据进入时,Opera 不会触发几个 readystatechange 事件(我认为 Firefox 主要是偶然发生的——据我所知,没有标准或文档强制执行此实现)。因此,他们使用超时而不是期望多个 readystatechange 事件。
    • @hallvors,是的,我在向 Jason 讲话。如果你留下更详细的答案,我会接受你的,除非你觉得杰森值得赏金。
    • 不幸的是,BrowserChannel 上的文档很薄,而且我自己也没有任何第一手经验,所以我不能真正说出它是如何解决这个特殊问题的。你能做的最好的就是查看代码并尝试解决它。如果您认为我不应该得到赏金,那我很好,我只是想为您指明一个有用的方向。
    【解决方案3】:

    我认为跨浏览器(包括 Opera)的方法可能是通过 Adob​​e Flash 应用程序流式传输数据。虽然它会引入对 Flash 插件的依赖,因此不是很受欢迎。

    【讨论】:

      【解决方案4】:

      我是与 goog.netBrowserChannel 兼容的正在开发中的 C++ HTTP 服务器的作者。您可以在此处找到我在研究协议时编写的文档:

      http://code.google.com/p/libevent-browserchannel-server/wiki/BrowserChannelProtocol

      长话短说,BrowserChannel 在 IE 上使用永久帧,在所有其他浏览器上使用 XHR 流。协议分为几个阶段,第一阶段是网络测试:

      1) 测试网络以确保支持响应“流式传输”(换句话说,不存在缓冲代理)
      2)检查对各种网络前缀的访问(以确保网络管理员没有阻止访问聊天)

      然后就可以开始实际的数据传输了。数据分为两个通道(前向和后向)。反向通道是一系列长期存在的(每个大约 4 分钟)请求,用于服务器将内容“流式传输”到客户端。为此,使用了 HTTP 分块编码。客户最好确保始终打开一个反向通道。服务器将大约每 4 分钟关闭一次,之后客户端将打开一个新的反向通道。前向通道用于将数据从客户端发送到服务器。这种数据推送是根据需要完成的。

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-12-28
        • 2011-03-13
        • 1970-01-01
        • 2012-10-24
        • 2012-01-23
        • 2010-11-24
        相关资源
        最近更新 更多