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

Posted

技术标签:

【中文标题】客户端如何在没有频繁 ajax 请求的情况下从服务器获取更新?【英文标题】:How client gets updates from server without frequent ajax request? 【发布时间】:2016-09-02 22:41:29 【问题描述】:

在我的项目中,有私人聊天和消息通知等功能。 如果有任何新的未读消息,消息通知会通知您。

为了实现这一点,我想到的想法是

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

在 chrome 中检查时的 ajax 请求将如下所示。

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

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

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

【问题讨论】:

【参考方案1】:

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

轮询(您在做什么 - 定期检查是否有消息) 长轮询(发出直到有消息才得到响应的请求) 流式传输(打开以增量方式发送可执行 javascript 更新的脚本连接) Websockets(最好的选择,如果支持 - 所有其余的都是针对 Websockets 最终解决的问题)

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

编辑:

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

正如我所说,您不想自己实现这些,因为它们很棘手且充满危险;大多数好的 Comet 库都会考虑浏览器的特性并选择最好的协议,这样对程序员来说是透明的,使用这种模型进行开发非常容易。例如,查看Socket.IO tutorials。

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

【讨论】:

我已经打开 Chrome 开发者控制台一段时间了,但我在网络视图中看不到任何新内容。这些选项中的任何一个都会做一些不同的事情来阻止网络流量以这种方式可见吗? @Joel 来自答案中提供的链接 “Comet 是一种 Web 应用程序模型,其中长期持有的 HTTP 请求允许 Web 服务器将数据推送到浏览器,而无需显式浏览器请求它。” 因为 Comet 是一个反向 ajax。响应来自服务器端,而不是由浏览器(客户端)发起。所以我猜这些请求不会显示在 Web 开发者控制台中。 @Lucky:不完全是如何工作的。除非客户端先联系服务器,否则服务器无法从客户端发起请求。 OP:如果您从页面加载开始检查 Stack Overflow 网络活动,我看到 qa.sockets.stackexchange.com,类型为 websocket。它的时间是永久“待定”。原因是,它在等待服务器说一些有趣的事情。 @Amadan 谢谢你,这清楚了!当我查看 Web Sockets 请求详细信息时,我实际上可以看到通知在它们发生时通过。【参考方案2】:

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

在 Chrome 中打开开发者控制台。进入Network标签,应用WSWebSocket过滤器并刷新页面。您将看到如下所示:

【讨论】:

以上是关于客户端如何在没有频繁 ajax 请求的情况下从服务器获取更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 JQUERY 的情况下从浏览器扩展向 localhost 发出 POST 请求?

GMail Chat 如何能够在没有客户端交互的情况下发出 AJAX 请求?

是否可以在没有客户端密码的情况下从 Spring OAuth2 服务器获取 access_token?

轮询和长轮询

轮询与长轮询

如何在没有节点导出器或 cadvisor 的情况下从目标服务器抓取数据