代码之家  ›  专栏  ›  技术社区  ›  Sandro

同步对文本字段的更改

  •  0
  • Sandro  · 技术社区  · 14 年前

    我正在尝试在flash上使用p2p,我遇到了一个小障碍,在前进之前我想澄清一下。技术本身(flash)对于这个问题并不重要,因为我认为这个问题发生在其他语言中。

    我正在尝试创建一个可由多人“实时”编辑的文档。就像谷歌文档一样。但我想知道,你如何建议同步每个人的文本?我的意思是,每次有人做更改时,我应该向所有人发送文本字段中所有文本的消息吗?这似乎效率很低。

    我认为必须有一个我可以学习和实现的设计模式,但我不确定从哪里开始。

    最理想的情况是,应用程序应该只向连接的客户机发送文档中发生的更改,并且具有某种缓冲区或纠错功能,可以用于检索可能错过的早期更改。有没有处理这类问题的既定设计模式?

    谢谢, 桑德罗

    2 回复  |  直到 14 年前
        1
  •  1
  •   pigiuz    14 年前

    我认为你的“最佳”解决方案实际上是你应该追求的。

    每个textfield都有一个模型,模型有一个历史记录(一个filo存储最后一个,比如10个值)。 每次编辑该文本字段时,都会将整个文本推送到模型中,并将增量发送到其他连接的客户机。 当其他客户机接收到数据时,他们只是从模型中选择最后一个值并将其合并到接收到的数据中。

    您可以通过在中间放置一个空闲计时器来优化机制:当用户在文本字段中键入某个内容时,您将该模型标记为“tobesenthroughthenet”,然后启动一个计时器。当计时器“嘀嗒”(timerevent.timer)停止时,收集标记的数据并将其发送到其他客户机。只要记住每次用户实际输入时都要重置计时器(semplication可以是keydown=reset,keyup=start)。

    还有一个优化可以发送压缩后的bytearray中的数据,但这需要您编写自己的协议,而且可能不是一个简单而快速的路径:)

        2
  •  1
  •   martineno    14 年前

    如果要求每个人都可以同时编辑文档,并且更改应该传播给每个人,并且不应该丢失任何更改,那么这是一个非常重要的问题。有几种不同的方法,但一种非常强大的方法是 Operational Transformation . 这与谷歌文档用于协作编辑的算法相同。

    Understanding and Applying Operational Transformation 还有服务员 hacker news 讨论可能是其他开始的好地方。

    这个 Wave Protocol 是作为开放源码发布的,因此您可以查看它是如何实现的。

    当然,您可以放弃复杂的同步,只允许人们轮流进行,一次只能有一个人编辑文档,而这个人只需将更改推送到组的其余部分。