AJAX监听器而不是轮询?

时间:2013-03-02 03:50:00

标签: javascript ajax listener

我在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>

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:1)

您所谈论的是推送从服务器到客户端 comet 您可以这样使用

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

你可以做另一件事

从你的JS发送一个请求并让它活着1分钟,然后做一个无限循环,睡眠几秒钟,如果它找到任何东西,然后将它返回给客户端,那么新的请求就会被称为 HeartBeat

我希望这可以提供帮助

答案 2 :(得分:0)

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

SockJS,使用各种方法在JavaScript中执行回调,其中一个是阻塞查询,另一个是WebSockets。如果你想做这类事,我强烈推荐它。

答案 3 :(得分:0)

您可以使用websockets执行此操作。不幸的是,目前并非所有浏览器都支持它们。

More info on websockets here.

相关问题