如何在没有频繁的ajax请求的情况下从客户端获取更新?

时间:2016-05-08 05:05:57

标签: jquery ajax server client client-server

在我的项目中,有私人聊天和消息通知等功能。 消息通知让我们知道是否有任何新的未读消息。


为实现这一目标,我想到的想法是

  

client - server模型类似,服务器应该侦听新请求。   就像那样,我认为应该有一些机制来监听服务器以获取有关新消息的信息。因为我知道ajax,所以我使用了ajax请求,间隔为2秒。

在Chrome中检查时,ajax会请求如下所示。 Ajax requests under network section in chrome

  

但我后来认为,如果这是唯一的想法,StackOverflow应该使用相同的技巧,因为它们异步更新通知/投票信息。

在chrome中检查他们的ajax请求,它完全是空白的。

我需要知道如何在不使用频繁的ajax请求的情况下实现它(这将增加服务器上的负载)。
使用最有效技术的简单示例对学习非常有用。

2 个答案:

答案 0 :(得分:7)

这被称为Comet,有几种方法可以实现它:

  • 轮询(您正在做什么 - 如果有消息,请定期检查)
  • 长轮询(在有消息之前发出请求但没有得到回复)
  • Streaming(打开以递增方式发送可执行JavaScript更新的脚本连接)
  • Websockets(最好的选择,如果支持的话 - 其余的都是针对Websockets最终要解决的问题)

实现它们很棘手,这里有许多库可供选择,为您正确实现它们(例如Socket.IO)。

修改

  

使用最有效技术的简单示例对学习非常有用。

正如我所说,你不想自己实施,因为它们很棘手且充满危险;最好的Comet库考虑了浏览器的功能并选择了最佳协议,因此它对程序员来说是透明的,这使得使用这个模型很容易开发。例如,请查看Socket.IO tutorials

另请注意,您需要一台能够处理Comet的服务器:例如: Socket.IO与Node.JS一起使用。例如,它们不能与默认的Apache一起使用。

答案 1 :(得分:3)

@Amadan提到的非常好,但StackOverflow和其他StackExchange网站主要将WebSocket用于现代浏览器(支持HTML5和WebSocket)。

在Chrome中打开开发人员控制台。转到网络标签,然后应用 WS WebSocket 过滤器并刷新页面。您将看到类似下面的内容:

enter image description here