3

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

4 回答 4

5

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

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

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

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

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

于 2013-03-02T03:58:05.037 回答
1

您所说的是从服务器推送到彗星客户端,您可以使用这种方式

但这可以用 HTML5 中的 node.js 和 WebSockets 完美地完成,但并非所有浏览器都支持检查这个

你可以做另一件事

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

我希望这可以帮助

于 2013-03-02T03:58:25.447 回答
0

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

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

于 2013-03-02T03:55:44.227 回答
0

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

更多关于 websockets 的信息在这里。

于 2013-03-02T03:56:09.093 回答