2010-11-18 75 views
0

我正在尝试使用Flash上​​的P2P,并且在前进之前我遇到了一些我想澄清的障碍。技术本身(Flash)对于这个问题并不重要,因为我认为这个问题出现在其他语言中。将更改同步到文本框

我正在尝试创建一个可以被多人“活”编辑的文档。就像Google Docs一样。但我想知道,你如何建议同步每个人的文本?我的意思是,每次有人进行更改时,我是否应该向每个人发送文本字段中的所有文本?这似乎非常低效。

我在想我必须有一个设计模式,我可以学习和实施,但我不知道从哪里开始。

理想情况下,应用程序应该只将已发生的变化发送给文档,并具有某种缓冲区或纠错功能,可用于检索可能错过的早期更改。是否有任何既定的设计模式来处理这类问题?

感谢, 桑德罗

回答

1

我觉得你的“最优”的解决方案实际上是一个你应该去。

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

您可以通过在中间放置一个空闲计时器来改进机制:当用户在文本框中输入某些内容时,将该模型标记为“toBeSentThroughTheNet”,然后启动计时器。当计时器“滴答”(TimerEvent.TIMER)时,您停止它,收集标记的数据并将其发送给其他客户端。只要记得每次用户实际输入时重新设置定时器(一个定时关键字为keydown = reset,keyup = start)。

一个更优化的可能是送装在一个压缩的ByteArray中的数据,但是这需要你自己写协议,可没那么容易和快速路径:)

+0

谢谢你的回应。我可以通过跟踪更改并仅通过发送来理解你的意思。我不知道如何说“什么”已经改变了。我认为这更多的是我所坚持的。我认为我的文档,我可以使用某种类型的DOM,也许只发送一个标识符和更新的数据? – Sandro 2010-11-18 19:38:18

+0

是的,这可能是一个好主意。如果你发送命令告诉“你有一个新对象”或者“对象id = 15改为'ciao'”,你会缩小带宽使用。 – pigiuz 2010-12-03 09:03:09

+0

实际上......一个“整体”DOM可能是一种矫枉过正,为了做到这一点,您可以将每个托管对象与一个id映射到一个字典中。 – pigiuz 2010-12-03 09:05:20

1

如果要求每个人都可以编辑该文件在同一时间和变化应该传播给每个人,不应该丢失任何改变,那么这是一个不平凡的问题。有几种不同的方法,但其中一个是相当强大的是Operational Transformation。这与Google文档用于协作编辑的算法相同。

Understanding and Applying Operational Transformation和服务人员hacker news讨论可能是其他好的开始。

Wave Protocol是作为开源发布的,所以你可以看看它是如何实现的。

你当然可以放弃棘手的同步,只允许人轮流,一次只有一个人可以编辑文档,这个人只是将更改推送到组的其余部分。