【问题标题】:AJAX listener rather than polling?AJAX 侦听器而不是轮询?
【发布时间】:2013-03-02 03:50:00
【问题描述】:

我在 python 中创建了自己的聊天网络服务器,并想知道不是 AJAX 每秒调用一次服务器(下面的 JS)。我可以修改我的服务器,所以当它更新 chat.html 文件时,它会将其推送给所有客户端。有没有办法使用 javascript 让它监听任何接收到的数据而不是轮询?

<script>
// Request the AJAX update the chat window every second
setInterval(function(){loadChat()},1000);

function loadChat()
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {
        xmlhttp = new XMLHttpRequest();

        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("chatWindow").innerHTML=xmlhttp.responseText;
            }
        }

        xmlhttp.open("GET","chat.html",true);
        xmlhttp.send(null);
    }
}
</script>

【问题讨论】:

    标签: javascript ajax listener


    【解决方案1】:

    是的,当然有。您可以使用(至少)四种技术:

    1. WebSockets. 这是最明显的解决方案。它允许您按需发送和接收消息,而无需轮询。但是,它可能在服务器端实现起来有些困难,因为它不是普通的 HTTP。此外,旧浏览器不支持 WebSockets。

    2. 服务器发送事件。这是不太理想的,但仍然适用于您。有了它,您无需轮询即可从服务器接收消息。它也更容易在服务器上实现,因为它只是普通的 HTTP,只是连接不会关闭。一些较旧的网络浏览器也不支持它,但它比 WebSockets 更受支持,而且很容易填充。

    3. COMET. 这基本上是对以下内容的改进。基本上,您有一个隐藏在屏幕外的iframe。每当有事件出现时,您都会发送(并刷新!)一个脚本标签,但不要关闭连接。超时后,关闭连接。然后刷新iframe。这也很容易实现,是纯 HTTP,不需要特殊的浏览器支持。但是,浏览器超时时间各不相同,这有点不雅。

    4. 在事件发生之前保持连接打开。这可能是最不可取的。在事件到来之前不要发送响应。当事件到来或发生超时时,发送响应。当客户端收到响应时,重新连接。这也有点不雅,但它有效。

    【讨论】:

      【解决方案2】:

      你所说的是推送从服务器到客户端comet你可以使用这种方式

      但这可以通过 HTML5 中的 node.js 和 WebSockets 完美完成,但并非所有浏览器都支持 check this out

      你可以做另一件事

      从你的 JS 发送一个请求,让它存活 1 分钟,然后创建一个无限循环,休眠几秒钟,如果找到任何东西,然后将其返回给客户端,否则发出一个新请求,这种技术称为 心跳

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        简单地说,在大多数情况下,您将无法使用.. 但是,您可以使用 HTML5 Websockets,尽管它们通常不受支持。

        SockJS,在JavaScript中使用多种方法做回调,其中一种是阻塞查询,另一种是WebSockets。如果您尝试做这种事情,我强烈推荐它。

        【讨论】:

        • 因为 WebSockets 不进行轮询,它们是一种可能的解决方案。还有我的答案中列出的其他内容。
        • 很酷,所以它是一个 JS 库,试图为当前不支持它的浏览器提供 HTML5 websocket 功能。
        • 对,我建议使用 SockJS,因为它结合了这些技术。
        • 嗯,基本上有就用,没有就用其他方法,其中一种就是阻塞查询
        【解决方案4】:

        您可以使用 websockets 做到这一点。不幸的是,目前并非所有浏览器都支持它们。

        More info on websockets here.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 2020-01-24
          • 1970-01-01
          • 2014-11-20
          • 2014-02-07
          • 2012-01-08
          • 1970-01-01
          相关资源
          最近更新 更多