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)
是的,当然有.您可以使用(至少)四种技术:
WebSockets的.这是最明显的解决方案.它允许您按需发送和接收消息,而无需轮询.但是,在服务器端实现它可能有点困难,因为它不是普通的HTTP.此外,旧浏览器不支持WebSockets.
服务器发送的事件.这不太令人满意,但仍然适合您.有了它,您可以从服务器接收消息而无需轮询.它也更容易在服务器上实现,因为它只是普通的HTTP,除了连接没有关闭.它也不支持某些较旧的Web浏览器,但它比WebSockets更受支持,并且非常容易填充.
彗星.这基本上是对以下内容的改进.基本上,你有一个iframe隐藏的屏幕外.每当有事件发生时,您发送(并刷新!)脚本标记,但不要关闭连接.超时后,关闭连接.然后刷新iframe.这也很容易实现,是纯HTTP,不需要特殊的浏览器支持.但是,浏览器超时有所不同,这有点不太优雅.
在事件发生之前保持连接打开.这可能是最不可取的.只是在事件发生之前不发送响应.当事件进入或发生超时时,发送响应.当客户端收到响应时,重新连接.这也有些不雅,但它确实有效.