【问题标题】:XHR persistent connection, how so?XHR 长连接,怎么回事?
【发布时间】:2009-12-03 04:33:50
【问题描述】:

我刚刚阅读了 Facebook 是如何设计他们的聊天系统的,上面写着: “并让 iframe 的 JavaScript 通过持久连接发出 HTTP GET 请求,该请求在服务器为客户端提供数据之前不会返回。如果请求被中断或超时,则会重新建立请求。这绝不是一种新技术:它是 Comet 的变体,特别是 XHR 长轮询和/或 BOSH。”

有人能解释一下如何向网络服务器发出持久请求吗?

【问题讨论】:

    标签: javascript xmlhttprequest comet


    【解决方案1】:

    基本上,您只需将请求保留在服务器上,直到 1) 有可用数据或 2) 服务器达到阈值并说“忘记它,重新建立,所以我知道你真的还在那里”。这种方法的困难在于服务器端的可扩展性,因为通常 Web 服务器被设计为尽可能快地执行,并且为传入的“长期持有”请求生成大量线程/进程是困难的。

    如果在同一个域上,这个长期持有的请求通常是 Xhr,如果是跨域,则通常是 JSONP。

    我们已经为我们的 IIS/ASP.NET Comet 服务器 (WebSync) 编写了一个完整的 Comet 客户端,您可以查看一下,也许会有一些想法。浏览client.js file 的源代码(添加 ?debug=true 以查看未压缩版本),您会看到一些对“连接”请求的引用——这些是对服务器的长轮询请求,等待~每个请求 25 秒,假设没有数据到达。

    【讨论】:

    • 奇怪。 “相当不错”的答案没有积分,但所有的功劳都归功于有人利用机会为他的产品做广告。好吧,可能是 jvenema 可以自己重新解释基础知识。我的回答被删除了。
    • 不用生气 Kooilnc;现在本来会引用您的帖子的人无法这样做。我已经更新了我的答案以提供更多细节,因为如果你没有得到拍拍,显然你不喜欢分享你的答案..
    • 其实是隐藏的广告惹恼了。背上的轻拍根本不打扰我。我想你的意思是好的,所以我会取消删除我的答案。其中提到的实验针对一种简单的长轮询(客户端)技术,而不使用 iframe。今天令我惊讶的是,我发现 avast webscanner 阻止了所有 readystates
    • 嗨 Kooilnc,感谢您取消删除;我坦率地承认,我会向人们推荐我的产品,但前提是它有意义。在这种情况下,我什至没有推荐它,而是允许访问其中一部分的源代码,所以我很高兴你能理解。是的,我是加拿大人,但 100% 是荷兰人。
    【解决方案2】:

    看看this page。我已经尝试过长轮询。基本上,它与对服务器的普通 XmlHTTP 请求(XHR、post 或 get)没有什么不同。保持连接打开的是服务器,客户端(浏览器)只是等待响应。虽然服务器没有关闭连接(readyState

    On this location 你可以找到一个非常基本且不完整的实验(仅适用于 Firefox),其中服务器以随机间隔发送一个 RGB 元组一段时间。连续 readyState 完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 2013-08-01
      • 2014-06-11
      • 2016-09-10
      • 2020-02-03
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多