客户端如何在不频繁使用ajax请求的情况下从服务器获取更新?

9
在我的项目中,有私聊和消息通知等功能。消息通知让我们知道是否有未读消息。
为了实现这一点,我想到的方法是像客户端-服务器模型一样,服务器应该监听新请求。因此,我认为应该有一些机制来监听服务器以获取有关新消息的信息。由于我知道ajax,所以我使用2秒的间隔进行ajax请求。
在chrome中检查ajax请求将如下所示。 Ajax requests under network section in chrome 但事后我想到,如果这是唯一的想法,那么StackOverflow应该使用相同的技巧,因为他们异步更新通知/投票信息。
在chrome中检查它们的ajax请求时,完全是空白的。
我需要知道如何在不频繁使用ajax请求的情况下实现,这将增加服务器的负载。
一个简单的例子,使用最有效的技术会非常有用。
2个回答

10
这被称为Comet,有几种实现方法:
  • 轮询(即您正在执行的操作-定期检查是否有消息)
  • 长轮询(发出请求,直到有消息才获得响应)
  • 流(打开一个脚本连接,逐步发送可执行的 JavaScript 更新)
  • Websockets(如果支持,则是最佳选择-所有其他选项都是 Websockets 最终解决的问题的 hack)
实现它们很棘手,有许多库可供选择,可以正确地为您实现它们(例如 Socket.IO)。 编辑:

使用最有效的技术提供一个简单的示例将非常有用。

正如我所说,您不想自己实现它们,因为它们很棘手且充满危险。大多数好的 Comet 库考虑了浏览器的功能并选择了最佳协议,使其对程序员透明,从而非常容易使用此模型进行开发。例如,请查看Socket.IO 教程

同时请注意,您需要拥有一台能够处理Comet的服务器:例如Socket.IO与Node.JS兼容。它们将无法使用默认的Apache等服务器。


1
我已经打开Chrome开发者控制台有一段时间了,但在网络视图中没有看到任何新的内容。这些选项中是否有任何一个会执行不同的操作,从而防止以这种方式查看网络流量? - Joel
1
@Joel,从答案中提供的链接可以得知:“Comet是一种Web应用程序模型,其中长时间持有的HTTP请求允许Web服务器向浏览器推送数据,而无需浏览器明确请求。”因为Comet是反向ajax。响应来自服务器端,而不是由浏览器(客户端)发起。所以我猜这些请求不会显示在Web开发者控制台中。 - Lucky
2
@Lucky:并不是这样的。服务器不能在客户端未首先联系服务器的情况下向客户端发起请求。 - Amadan
1
如果你检查 Stack Overflow 网络活动,从页面加载开始,你会看到 qa.sockets.stackexchange.com,类型为 websocket。它的时间永久是“挂起”。原因是它正在等待服务器说一些有趣的东西。 - Amadan
@Amadan 谢谢,这样就清楚了!当我查看Web Sockets请求详细信息时,我实际上可以看到通知随着它们发生而传递。 - Joel

4

Amadan提到的很好,但StackOverflow和其他StackExchange网站主要使用WebSocket来支持现代浏览器(支持HTML5和WebSocket)。

在Chrome中打开开发者控制台。转到网络选项卡,并应用WSWebSocket过滤器并刷新页面。您将看到以下内容:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接