【问题标题】:close long poll connection, jQuery-ajax关闭长轮询连接,jQuery-ajax
【发布时间】:2009-10-05 21:15:10
【问题描述】:

背景
我使用支持长轮询的类似 Tornado 的服务器。用户访问的每个新网页都会向服务器设置一个长轮询,如下所示:

$.ajax({
    type: 'GET',
    url: "/mylongpollurl/",
    dataType: 'application/json',
    success: function(json) {
        // I do stuff here
    },
    error: function(xhr, errText, ex) {
        // If timeout I send a new long-poll request
    }
});

问题
我现在将依靠从 Fiddler 获得的数据来监控我的浏览器发出的所有请求(目前为 FF)。

  1. 页面 1 已加载并发出长轮询请求,现在在服务器端空闲。
  2. 我单击第 2 页的链接,该页面已加载并设置长轮询请求,但来自第 1 页的长轮询请求仍在服务器端空闲(根据 Fiddler)。

这意味着当点击页面时我会堆叠所有长轮询调用,因此最终会在服务器上产生大量活动连接(或者它们可能共享连接?)

我的想法
- 因为它是一个类似 Tornado 的服务器(使用 epoll),它可以处理相当多的连接。但在我看来,这一事实不可利用。我的意思是,在这种情况下,我不希望服务器超时(如果客户端消失了)。
- 我知道那些独立页面更好地使用一个共同的头部,并且只通过 ajax 调用交换内容,但我们今天使用的这种设计不是我的调用......
- 解决此问题的最佳方法可能是重新使用连接(我认为很难断开)或在浏览器离开页面后立即关闭(您单击另一个页面)。

谢谢
-- MyGGaN

【问题讨论】:

    标签: ajax jquery long-polling ajax-polling


    【解决方案1】:

    对于长轮询连接,您需要确保在 Fiddler 中设置了“流式传输”选项。否则,Fiddler 将保持连接打开,无限期地等待响应完成。

    通常,当您从一个页面导航到另一个页面时,客户端应该断开打开的长轮询连接,从而有效地关闭连接。我说 应该 因为这并不总是能正常工作,例如,当你在 IE 中关闭一个弹出窗口时。

    【讨论】:

    • 感谢您的意见!我尝试在 Fiddler 中启用流式传输,还尝试了一个名为 Http debug PRO 的程序,但它们仍然显示连接已打开。我看看能不能在服务器端设置一个连接计数器。
    • 您可以尝试让您的 OnUnload 事件将事件处理程序与 XMLHTTPRequest 对象分离。这可能会改善对象的垃圾收集,进而可能会关闭底层连接。
    • 谢谢,我会试试看,如果这解决了问题,请告诉您。
    • 在 jQuery 中,您可以使用 beforeSend(XMLHttpRequest) 函数来进行 ajax 调用。我将这些 XHR 对象保存在一个数组中,并在窗口卸载时为数组中的每个对象调用 .abort()。这实际上有点帮助。但是没有关闭连接,所以我仍然打开了很多连接。欢迎进一步的想法!感谢 EricLaw 的提示!
    猜你喜欢
    • 2012-10-08
    • 2014-12-13
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多