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

查找已更改的内容并仅上载更改

  •  8
  • Kranu  · 技术社区  · 14 年前

    我只是在这里寻找想法/建议;我并没有要求一个完整的解决方案(尽管如果你有一个,我很乐意看到)

    例如,如果我有

    asdfghjklasdfghjkl
    

    我把它改成

    asdfghjklXasdfghjkl
    

    例如,像 8,X 发送到服务器可能表示: add an X to the 8th position

    D8,3 可能意味着: go to position 8 and delete the previous 3 terms

    但是,如果一个请求在发送到服务器的过程中损坏,则整个文档可能会损坏,因为位置将被更改。一个简单的散列可以检测到损坏,但是如何从损坏中恢复呢?客户端将拥有所有数据,但数据可能非常大,不太可能上载。

    所以谢谢你通读这篇文章。以下是需要建议的简短摘要

    • 变更/修改检测
    • 传达更改的方法
    • 其他需要改进的地方
    3 回复  |  直到 14 年前
        1
  •  4
  •   Lee    14 年前

    已经有一种可接受的形式来传递这种“差异”信息。它叫 Unified Diff .

    google-diff-match-patch

    您应该能够在客户端变量中保留“原始文本”和“修改文本”,然后在javascript中生成diff(通过diff match补丁),将其连同散列一起发送到服务器,并在服务器上重新构造它(使用diff match补丁或unix“补丁”程序)。

    在第一次将原始文本发送给客户机时,您可能还需要考虑包含“版本”(或修改日期)。然后在客户端发送到服务器的“diff请求”中包含相同的版本(或日期)。在应用diff之前,请验证服务器上的版本,以确保在进行修改时服务器的文本副本没有与客户端的副本不同。(当然,为了使其正常工作,您需要在每次主副本更新时更新服务器上的版本号)。

        2
  •  1
  •   joni    14 年前

    你有一个非常有趣的方法。但是如果文本文件真的太大了,每次上传都需要太多的时间,为什么要把整个东西都发送给客户呢?客户真的需要接收整个5mb文本文件吗?难道不能只送他需要的东西吗?

    不管怎样,对于你的问题: diff . 对于算法,请阅读 here . 这可能是一种提交更改的方法,并为其指定格式。你只需要重建 diff

    对于损坏问题:您不必担心您的日期会在途中损坏,因为HTTP所基于的TCP协议看起来所有内容都不会损坏。你应该担心的是连接重置。也许你能做点握手之类的事?当客户端向服务器发送更新时,服务器应用修改并保留文件的一个旧版本。为了确保客户机已经从服务器接收到修改成功的批准(这就是发生conneciton重置的地方),客户机将另一个ajax请求发送回服务器。如果这个文件在定义的时间内没有到达服务器,则会在服务器端重置该文件。

        3
  •  1
  •   Thomas    14 年前

    这听起来像一个版本控制系统(CVS、SVN、Git、Bazaar)已经很好地解决了的问题。

    它们都很容易在服务器上设置,您可以通过PHP与它们通信。

    你不会得到你要求的“只发送更新”功能。我不知道这对你有多重要。就带宽而言,纯文本发送确实非常便宜。

    就我个人而言,我可能会做出类似维基的妥协。将整个文本分解成更小的语义连贯的块(章节,甚至段落),在客户端确定哪些块被编辑过(不进入字符级别),然后发送这些块。

    然后,服务器可以用一个diff来回答,由您的版本控制系统生成,这是他们非常有效的做法。如果希望允许并发更改,则可能会遇到编辑器必须手动合并的情况。

    另一个普遍的暗示可能是看看谷歌对Wave做了什么。我必须在这里保持一般性,因为我自己并没有真正详细地研究过它,但我似乎还记得有一些关于它们如何解决实时并发编辑问题的文章,这似乎正是您想要做的。

    总之,我相信你计划解决的问题远非微不足道,已经有很多工具可以解决相关的问题,我个人会妥协并重新制定方法,以减少工作量。