AJAX监听器而不是轮询?

LF4*_*LF4 3 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>
Run Code Online (Sandbox Code Playgroud)

ick*_*fay 5

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

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

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

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

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