我在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>
答案 0 :(得分:5)
是的,当然有。您可以使用(至少)四种技术:
WebSockets。这是最明显的解决方案。它允许您按需发送和接收消息,而无需轮询。但是,在服务器端实现它可能有点困难,因为它不是普通的HTTP。此外,旧浏览器不支持WebSockets。
服务器发送的事件。这不太合适,但仍然适合您。有了它,您可以从服务器接收消息而无需轮询。它也更容易在服务器上实现,因为它只是普通的HTTP,除了连接没有关闭。它也不支持某些较旧的Web浏览器,但它比WebSockets更受支持,并且很容易填充。
COMET。这基本上是对以下内容的改进。基本上,你有一个隐藏在屏幕外的iframe
。每当有事件发生时,您发送(并刷新!)脚本标记,但不要关闭连接。超时后,关闭连接。然后刷新iframe
。这也很容易实现,是纯HTTP,不需要特殊的浏览器支持。但是,浏览器超时有所不同,这有点不太优雅。
在事件发生之前保持连接打开。这可能是最不可取的。只是在事件发生之前不发送响应。当事件进入或发生超时时,发送响应。当客户端收到响应时,重新连接。这也有些不雅,但确实有效。
答案 1 :(得分:1)
您所谈论的是推送从服务器到客户端 comet 您可以这样使用
但是这可以通过HTML5中的node.js和WebSockets完美地完成,但并不是所有浏览器都支持check this out
你可以做另一件事
从你的JS发送一个请求并让它活着1分钟,然后做一个无限循环,睡眠几秒钟,如果它找到任何东西,然后将它返回给客户端,那么新的请求就会被称为 HeartBeat
我希望这可以提供帮助
答案 2 :(得分:0)
简单地说,在大多数情况下,您将无法使用{但是,您可以使用HTML5 Websockets,但它们通常不受支持。
SockJS,使用各种方法在JavaScript中执行回调,其中一个是阻塞查询,另一个是WebSockets。如果你想做这类事,我强烈推荐它。
答案 3 :(得分:0)
您可以使用websockets执行此操作。不幸的是,目前并非所有浏览器都支持它们。