16

我知道我们可以通过定期轮询更改来做到这一点。这可以通过 AJAX 来实现(例如使用jQuery.load()with setInterval())。

但我想知道还有其他方法可以做到这一点吗?其他成本更低或更有效的方法?一个很棒的聊天客户端遵循什么逻辑?一旦你开始打字,另一端就会知道你正在打字。

我们在 stackoverflow 上遵循什么机制来更新赞成计数或显示已进行编辑等,而不刷新页面?

4

1 回答 1

25

当谈到保持客户端和服务器(接近)实时同步时,有 3 件事会立即浮现在脑海中:

  • 长轮询:您已经提到了这个,您在客户端上设置了一个计时器,它每 10 秒左右触发一个新的 AJAX 请求。这可能是三者中最“低技术”的,也是效率最低的;但它也是最兼容的(这意味着它可以在所有浏览器中运行,甚至像 IE6/7 这样的浏览器)

  • WebSockets:sdespont 已经在评论中提到了这个。虽然 WebSockets 比长轮询更有效(因为它只是无限期地保持两种客户端-服务器通信打开),但如果您要做的只是从服务器获取定期更新,它可能是一个非常严厉的解决方案。Firefox 和 Chrome 的所有版本都支持它,IE 在 IE10 中添加了支持

  • 服务器发送的事件:这个似乎不太受欢迎(或者只是不那么知名)。它允许服务器向客户端发送更改(与客户端向服务器请求更改相反,就像长轮询的情况一样)。这也只是一种单向通信(服务器 --> 客户端),并且在请求完成后连接会关闭(与 2 向通信保持打开状态的 WebSockets 相反)。再次强调,并不是所有的浏览器都支持,而且根本没有 IE 支持

也是一篇很好的文章,它解释了更现代的客户端-服务器通信方式之间的区别。如果您想了解有关服务器发送事件的更多信息,这是一篇很好的文章

于 2012-12-28T14:22:44.033 回答