2010-11-18 12 views
0

Ich experimentiere mit P2P auf Flash, und ich bin auf eine kleine Hürde gestoßen, die ich klären möchte, bevor ich weitermache. Die Technologie selbst (Flash) spielt für dieses Problem keine Rolle, da ich denke, dass dieses Problem in anderen Sprachen auftritt.Änderungen an einem Textfeld synchronisieren

Ich versuche ein Dokument zu erstellen, das von mehreren Personen "live" bearbeitet werden kann. Genauso wie Google Docs. Aber ich frage mich, wie würden Sie vorschlagen, alle Texte zu synchronisieren? Ich meine, sollte ich jedem mit dem ganzen Text im Textfeld jedes Mal eine Nachricht schicken, wenn jemand eine Änderung vornimmt? Das scheint sehr ineffizient zu sein.

Ich denke, es muss ein Entwurfsmuster geben, das ich lernen und implementieren kann, aber ich bin mir nicht sicher, wo ich anfangen soll.

Optimal sollte die Anwendung die verbundenen Clients nur die Änderungen senden, die im Dokument aufgetreten sind, und eine Art Puffer oder Fehlerkorrektur haben, die zum Abrufen früherer Änderungen verwendet werden kann, die möglicherweise verpasst wurden. Gibt es ein etabliertes Designmuster, das sich mit dieser Art von Problem befasst?

Danke, Sandro

Antwort

1

Ich denke, Ihre „Optimal“ Lösung tatsächlich derjenige ist, den Sie gehen sollten.

Jedes Textfeld hat ein Modell, das Modell hat eine Historie (ein FILO speichert zuletzt, sagen wir mal 10 Werte). Jedes Mal, wenn Sie dieses Textfeld bearbeiten, schieben Sie den gesamten Text in das Modell und senden das Delta an andere verbundene Clients. Wenn andere Clients die Daten empfangen, wählen sie einfach den letzten Wert aus dem Modell aus und führen es mit den empfangenen Daten zusammen.

Sie können den Mechanismus verfeinern, indem Sie einen Leerlauftimer in die Mitte setzen: Wenn ein Benutzer etwas in das Textfeld schreibt, markieren Sie dieses Modell als "toBeSentThroughTheNet" und Sie starten einen Timer. Wenn der Timer "tickt" (TimerEvent.TIMER), stoppen Sie ihn, sammeln die markierten Daten und senden sie an andere Clients. Denken Sie daran, den Timer jedes Mal zurückzusetzen, wenn der Benutzer gerade tippt (eine Vereinfachung könnte keydown = reset, keyup = start) sein.

eine weitere Optimierung der Daten senden verpackt in einem komprimierten bytearray sein könnte, aber dies erfordert, dass Sie Ihr eigenes Protokoll schreiben und nicht so ein einfacher und schneller Weg sein :)

+0

Vielen Dank für Ihre Antwort. Ich kann verstehen, was Sie meinen, indem Sie die Änderungen verfolgen und nur das durchschicken. Ich bin mir nicht sicher, wie ich sagen soll "was" hat sich geändert. Ich denke, das ist mehr, woran ich festhalte. Ich vermute für mein Dokument, ich könnte eine Art von DOM verwenden und vielleicht nur eine Kennung und die aktualisierten Daten senden? – Sandro

+0

Ja, das könnte eine gute Idee sein.Sie würden die Bandbreitennutzung verringern, wenn Sie Befehle senden, die sagen "Hey, es gibt ein neues Objekt" oder "Hey, die Objekt-ID = 15 wurde in" Ciao "geändert. – pigiuz

+0

eigentlich ... ein "ganzes" DOM ​​könnte ein Overkill sein, um das zu tun, könnte man jedes gemanagte Objekt mit einer ID in ein Dictionary abbilden. – pigiuz

1

Wenn die Anforderung, dass jeder mich anpassen kann, Das Dokument zur gleichen Zeit und die Änderungen sollten an alle weitergegeben werden und keine Änderungen verloren gehen, dann ist es ein nicht-triviales Problem. Es gibt einige verschiedene Ansätze, aber eine, die ziemlich robust ist, ist Operational Transformation. Dies ist derselbe Algorithmus, den Google Docs für die gemeinsame Bearbeitung verwendet.

Understanding and Applying Operational Transformation und die begleitende hacker news Diskussion sind wahrscheinlich andere gute Orte zu starten.

Die Wave Protocol wurde als Open Source veröffentlicht, so dass Sie einen Blick darauf werfen können, wie es implementiert ist.

Sie könnten natürlich auf die knifflige Synchronisation verzichten und es einfach zulassen, dass sich die Leute abwechseln und nur eine Person das Dokument gleichzeitig bearbeiten kann und diese Person die Änderungen einfach an den Rest der Gruppe weiterleitet.

Verwandte Themen