我在Flash上试验P2P,我遇到了一个障碍,我想在向前推进之前澄清一下。技术本身(Flash)对于这个问题并不重要,因为我认为这个问题出现在其他语言中。
我正在尝试创建一个可由多人“实时”编辑的文档。就像Google Docs一样。但我想知道,你会如何建议同步每个人的文字?我的意思是,每当有人做出改变时,我是否应该向每个人发送文本字段中的所有文字?这似乎非常低效。
我认为必须有一个我可以学习和实施的设计模式,但我不知道从哪里开始。
最理想的情况是,应用程序应仅向连接的客户端发送文档发生的更改,并具有某种缓冲区或错误更正,可用于检索可能已丢失的早期更改。是否存在处理此类问题的既定设计模式?
谢谢, 桑德罗
答案 0 :(得分:1)
我认为您的“最佳”解决方案实际上是您应该选择的解决方案。
每个文本字段都有一个模型,模型有一个历史记录(一个FILO存储最后一个,比方说10个值)。 每次编辑该文本字段时,都会将整个文本推送到模型中,并将增量发送到其他连接的客户端。 当其他客户端收到数据时,他们只需从模型中选择最后一个值并将其合并到接收的数据中。
您可以通过在中间放置一个空闲计时器来优化机制:当用户在文本字段中键入内容时,您将该模型标记为“toBeSentThroughTheNet”并启动计时器。作为计时器“ticks”(TimerEvent.TIMER)你停止它,收集标记的数据并将其发送给其他客户端。只要记住每次用户实际打字时重置计时器(简化就是keydown = reset,keyup = start)。
另外一个优化可以发送压缩的bytearray中打包的数据,但这需要您编写自己的协议,可能不是那么简单快捷的路径:)
答案 1 :(得分:1)
如果要求是每个人都可以同时编辑文档并且更改应该传播给每个人并且不应该丢失任何更改,那么这是一个非常重要的问题。有几种不同的方法,但非常强大的方法是Operational Transformation。这与Google Docs用于协作编辑的算法相同。
Understanding and Applying Operational Transformation以及随之而来的hacker news讨论可能是其他好的开始。
Wave Protocol已作为开源发布,因此您可以查看其实现方式。
你当然可以放弃棘手的同步,只允许人们轮流进行,一次只有一个人可以编辑文档,而这个人只是将更改推送到组的其余部分。