2010-11-18 26 views
0

J'expérimente le P2P sur Flash, et j'ai rencontré un petit obstacle que j'aimerais clarifier avant d'aller de l'avant. La technologie elle-même (Flash) n'a pas d'importance pour ce problème, car je pense que ce problème se produit dans d'autres langues. J'essaie de créer un document qui peut être édité "live" par plusieurs personnes. Tout comme Google Docs à peu près. Mais je me demande, comment suggéreriez-vous de synchroniser le texte de tout le monde? Je veux dire, devrais-je envoyer un message à tout le monde avec tout le texte dans le champ de texte chaque fois que quelqu'un fait un changement? Cela semble très inefficace.Synchroniser les modifications à un champ de texte

Je pense qu'il doit y avoir un modèle de conception que je peux apprendre et implémenter, mais je ne sais pas par où commencer.

De manière optimale, l'application doit envoyer aux clients connectés uniquement les modifications apportées au document et disposer d'une sorte de correction de tampon ou d'erreur pouvant être utilisée pour récupérer les modifications antérieures qui ont pu être ignorées. Y a-t-il un modèle de conception établi qui traite de ce type de problème?

Merci, Sandro

Répondre

1

Je pense que votre solution « optimale » est en fait celui que vous devriez aller.

chaque champ de texte a un modèle, le modèle a un historique (un FILO stockant la dernière, disons, 10 valeurs). chaque fois que vous modifiez ce champ de texte, vous poussez le texte entier dans le modèle et envoyez le delta à d'autres clients connectés. lorsque les autres clients reçoivent les données, ils sélectionnent simplement la dernière valeur du modèle et la fusionnent aux données reçues.

Vous pouvez affiner le mécanisme en plaçant une minuterie d'inactivité au milieu: lorsqu'un utilisateur saisit quelque chose dans le champ de texte, vous marquez ce modèle comme "toBeSentThroughTheNet" et vous lancez un minuteur. Lorsque la minuterie "cochée" (TimerEvent.TIMER) vous l'arrêtez, collectez les données marquées et envoyez-les à d'autres clients. N'oubliez pas de réinitialiser la minuterie chaque fois que l'utilisateur tape réellement (une semplification peut être keydown = reset, keyup = start).

une optimisation plus pourrait être envoyer les données emballés dans un bytearray comprimé, mais cela exige que vous écrivez votre propre protocole et peut-être pas un chemin facile et rapide :)

+0

Nous vous remercions de votre réponse. Je peux comprendre ce que vous voulez dire en suivant les changements et en n'envoyant que cela. Je ne suis pas sûr de savoir comment dire "quoi" a changé. Je pense que c'est plus ainsi que je suis coincé. Je suppose que pour mon document, je pourrais utiliser une sorte de DOM et peut-être seulement envoyer un identifiant et les données mises à jour? – Sandro

+0

oui, ça pourrait être une bonne idée.vous réduirez l'utilisation de la bande passante si vous envoyez des commandes en disant "hé il y a un nouvel objet" ou "hé l'id de l'objet = 15 changé en 'ciao'". – pigiuz

+0

en fait ... un DOM "entier" peut être un overkill, afin de faire cela, vous pouvez simplement mapper chaque objet géré avec un ID dans un dictionnaire. – pigiuz

1

Si l'exigence est que tout le monde peut éditer le document en même temps et les changements devraient être propagés à tout le monde et aucun changement ne devrait être perdu, alors c'est un problème non trivial. Il y a peu d'approches différentes, mais celle qui est assez robuste est Operational Transformation. C'est le même algorithme que Google Docs utilise pour l'édition collaborative.

Understanding and Applying Operational Transformation et la discussion accompagnatrice hacker news sont probablement d'autres bons endroits pour commencer.

Le Wave Protocol a été publié en tant que code source ouvert, vous pouvez donc jeter un coup d'œil sur la façon dont il est implémenté.

Vous pourriez bien sûr renoncer à la synchronisation difficile et permettre aux gens de se relayer et une seule personne peut éditer le document à la fois et cette personne pousse simplement les changements au reste du groupe.