2013-12-12 80 views
0

我正在創建一個可以被許多用戶同時修改的文檔。簡化文件可以被認爲是一個字符串。在進行修改時,整個字符串被髮送到所有客戶端,並且它們的字符串版本被替換爲新的字符串。就通過網絡發送的數據量而言,這對於大字符串非常重要。所以我想盡可能少地發送,即使這意味着更多的工作客戶端。如何更新性能良好的修改過的字符串

我使用的是JavaScript,但並不重要。

我已經開始保存字符串作爲變量「oldstring」和修改後,我有變量「newstring」。我發送變量「消息」(目前等於「newstring」)。所有客戶端收到「消息」並使用它們的「老字符串」更新

非常感謝所有幫助。 :)

回答

1

您可以使用Google Diff/Match/Patch library來實現此目的。它具有Python,C++,Java,LUA,Objective C和Javascript的綁定。您可以將原始文件下載到客戶端,在服務器端生成補丁列表(您想要跟蹤哪個客戶端了解哪個版本以瞭解您的出發點是什麼;這可以在客戶端或服務器),將客戶端本地修訂的修補程序最新下載到客戶端,然後使用客戶端庫來應用修補程序。一旦獲得更改,您需要更新該客戶端修訂版追蹤編號。

爲了完整起見,我已經包含了一個實現示例。我對這個圖書館的工作有多好,並打算將其保留在我的工具欄中印象深刻。

// C# server-side code 
DiffMatchPatch.diff_match_patch differ = new DiffMatchPatch.diff_match_patch(); 
// I'm using literals, you'd pull these from a DB, etc. 
var results = differ.patch_make("ABCDEFG", "ABCDEFQ"); 
var serializedResults = differ.patch_toText(results); 
// Send serializedResults to client... 

在客戶端:

// Javascript client-side code 
var patcher = new diff_match_patch(); 
// The below literal is what *would* be sent 
var patches = patcher.patch_fromText("@@ -3,5 +3,5 @@\n CDEF\n-G\n+Q\n"); 
var results = patcher.patch_apply(patches, 'ABCDEFG'); 
alert(results);