27

我想做一些与 Google Doc 的实时更新非常相似的事情——所有用户都可以“立即”看到文档中其他用户的操作。

为了实现这一点,我的想法到目前为止:

  • 在后台执行连续的 AJAX 请求(这似乎是性能密集型的)?
  • 当然,服务器没有办法将通知推送到其所有客户端并相应地更新它们吗?
  • AJAX 每 X 秒请求一次,并在这些 X 秒内完成一个缓冲/延时动作(模拟实时效果)?

我想知道其他人试图达到这种效果的经验。做这个的最好方式是什么?

感谢所有帮助。

注意:我并不是专门寻找实时文档编辑解决方案。我正在寻找一种解决方案来解决 Google 对其 Docs 所做的相同概念。我实际上会以稍微不同的方式使用该解决方案。

4

11 回答 11

13

我投票赞成 Long-poll 策略:每个客户端向服务器打开一个请求,但服务器从不中断连接,只是不时发送一些 java-script。

不断的 AJAX 请求会杀死你的服务器。

于 2010-09-13T12:36:45.423 回答
8

查看谷歌 mobwrite。它是一个插入式库,可通过操作转换实现 html 表单的协作编辑。

从服务器获取事件推送是很容易的部分,有很多方法可以做到这一点。确保所有客户端的状态一致,这是困难的部分。这就是操作转换算法的用武之地。

于 2010-09-14T20:33:10.560 回答
3

Ajax 方法是一种方法。您可以像聊天应用程序一样实现它。实际的方式将取决于正在查看的数据。简而言之

  1. 创建会话。它可以容纳共享文档的用户(例如 excel 文件)
  2. 当用户 A 进行更改(例如更新单元格 A5)时,使用 Ajax 将更改发送到服务器。更改可以与到达日期或某些索引值一起存储。
  3. 页面不时触发后台 Ajax 调用。作为请求的一部分,最后访问日期也将通过。
  4. 收到请求后,您只需提供上次或索引所做的所有更改。您可以将新的日期或索引值包含在响应中,以便将其用于下一个请求。
  5. 当您确定无法访问顶部 X 元素时,您可以删除它们

它是否会是性能密集型的,很大程度上取决于如何构建所有内容。

您的另一个选择是网络套接字。没有亲自使用过,但如果您可以控制用户将使用的浏览器,您可以试一试。它允许服务器将数据推送到浏览器。一些链接: Web Sockets JSFirefox 中的 Web Sockets

于 2010-09-12T22:25:57.460 回答
3

另一种选择是Orbited

Orbited 在浏览器中提供了一个纯 JavaScript/HTML 套接字。它是一个 Web 路由器和防火墙,允许您将 Web 应用程序与任意后端系统集成。您可以在浏览器中实现任何网络协议——无需借助插件。

Orbited 是一个 HTTP 守护程序,针对长期彗星连接进行了优化。它旨在与新的和现有的应用程序轻松集成。Orbited 允许您编写实时 Web 应用程序,例如聊天室或即时消息客户端,而无需使用 Flash 或 Java 等任何外部插件。

于 2010-09-15T04:43:41.403 回答
3

如果您的用户只使用现代浏览器,那么我会尝试 HTML 5 附带的 websocket 标准。未来将有越来越多的浏览器支持它,Google 和 Apple 等公司正在致力于此。这里有一个入门教程: http: //net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

于 2010-09-16T14:18:45.970 回答
2

如果您不想使用 Web Sockets,因为它们没有得到广泛支持,您需要查找 Comet。Google Docs 可能就是这样做的。

于 2010-09-12T22:32:43.477 回答
2

如果您正在寻找实时协作的富文本编辑器, EtherPad已经开源。

于 2010-09-16T04:40:01.510 回答
1

限制 ajax 请求数的一种方法是巧妙地将它们分开。您不需要每秒都发出请求。当您收到有关活动的响应时,请在 1 秒内执行另一个请求。如果没有活动,则 2 秒,然后 4 秒,等等,请求之间最多可能有 30 秒。发生更新时,重置计时器。基本上,以一种巧妙的方式分隔您的请求,以使 GUI看起来尽可能响应。

于 2010-09-12T22:39:10.210 回答
1

我建议使用像Atmosphere这样的 Comet 框架。它会自动为你的消息选择一种传输机制,如果你幸运的话,它可以是 websockets(但由于这是抽象的,你不必担心)。无论如何,如果您不必处理单个请求/响应以及您将遇到的所有错误源和浏览器错误,那么它是非常有价值的。我去过那儿。有龙。:-)

于 2010-09-17T20:29:46.930 回答
1

另请查看 pubsubhubbub - http://code.google.com/p/pubsubhubbub/ 观看视频以了解简短介绍。

于 2010-09-19T08:39:01.923 回答
0

您还可以查看ShareJS一个 Operational Transform 库和Derby,它是一个基于 sharejs 构建的框架。它们都有 node.js 后端——sharejs 是由 Google Wave 工程师编写的。

于 2013-09-23T17:07:15.870 回答