代码之家  ›  专栏  ›  技术社区  ›  MyGGaN

关闭长轮询连接,jquery ajax

  •  3
  • MyGGaN  · 技术社区  · 16 年前

    背景
    我使用一个类似龙卷风的服务器来支持长时间的投票。用户访问的每个新网页都会设置对服务器的长轮询,如下所示:

    $.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)。

    这意味着我将在单击页面时堆叠所有长轮询调用,从而在服务器上结束大量活动连接(或者它们可能共享连接?)

    我的想法
    -由于它是一个类似龙卷风的服务器(使用epoll),它可以处理相当多的连接。但在我看来,这一事实是不可利用的。我的意思是我不希望在服务器上有一个超时(如果客户端消失)。
    -我知道那些独立页面更好地使用了一个公共的头部,并且只通过ajax调用交换内容,但是我们今天使用的这个设计不是我的要求……
    -解决这个问题的最好方法可能是重新使用连接(我认为很难拔出),或者在浏览器离开页面时立即关闭连接(单击另一个页面)。

    谢谢
    ——MyGGaN

    1 回复  |  直到 14 年前
        1
  •  4
  •   EricLaw    16 年前

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

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