2010-11-18 11 views
0

私はFlash上​​でP2Pを試していますが、私は前進する前に明確にしたい少しのハードルに出くわしました。この問題は他の言語でも発生すると思うので、技術自体(Flash)はこの問題には関係ありません。テキストフィールドに変更を同期

私は、複数の人が「ライブ」編集できるドキュメントを作成しようとしています。ちょうどGoogle Docsのように。しかし、私は皆さんのテキストを同期させることをどのように提案したいと思いますか?つまり、誰かが変更を加えるたびにテキストフィールド内のすべてのテキストを全員にメッセージする必要がありますか?それは非常に非効率なようです。

私は学習して実装できるデザインパターンが必要だと思っていますが、どこから始めたらよいか分かりません。

ベストプラクティスでは、アプリケーションは接続されたクライアントにドキュメントに加えられた変更のみを送信し、失われた可能性のある以前の変更を取得するために使用できるバッファまたはエラー修正が必要です。このタイプの問題を扱う確立された設計パターンはありますか?

おかげで、 サンドロ

答えて

1

私はあなたの「最適」ソリューションは、実際にあなたが行くべきものだと思います。

各テキストフィールドにはモデルがあり、モデルには履歴(最後に格納されたFILO、つまり10個の値)があります。 そのテキストフィールドを編集するたびに、テキスト全体をモデルにプッシュし、デルタを他の接続されたクライアントに送信します。 他のクライアントがデータを受信すると、モデルから最後の値を選択し、受信したデータにマージします。

アイドルタイマーを中央に置くことで、メカニズムを改良することができます。ユーザーがテキストフィールドに何かを入力すると、そのモデルに "toBeSentThroughTheNet"とフラグを立ててタイマーを開始します。タイマー "ticks"(TimerEvent.TIMER)を停止すると、フラグを立てたデータを収集し、他のクライアントに送信します。ユーザーが実際に入力するたびにタイマーをリセットすることを覚えておいてください(semplification coulはkeydown = reset、keyup = start)。

1つの以上の最適化は、圧縮されたByteArrayにパックされたデータを送信することができるが、これはあなたがあなた自身のプロトコルを記述する必要がないので、簡単かつ迅速なパスでも:)

+0

ありがとうございます。変更内容を追跡し、その変更のみを送信することによって、あなたが意味することを理解できます。私はどのように "何"が変更されたかを伝える方法がわからない。私はそれがもっと私が立ち往生しているものだと思う。私は自分のドキュメントを想定していましたが、何らかのDOMを使用して、識別子と更新されたデータのみを送信することができましたか? – Sandro

+0

はい、いい考えです。"新しいオブジェクトがあるか"、または "オブジェクトID = 15が 'ciao'に変更されたことを伝えるコマンドを送信すると、帯域幅の使用量を減らすことができます。 – pigiuz

+0

実際には... "全体の" DOMは、idを持つ各管理対象オブジェクトを辞書にマップするだけで、過剰なものになる可能性があります。 – pigiuz

1

要件は、誰もが編集できるということであるならば同じ時間に文書が変更され、すべての人に伝播され、変更が失われないようにする必要があります。それは重要な問題ではありません。そこにはいくつかのアプローチがありますが、かなり頑強なものはOperational Transformationです。これは、Googleドキュメントが共同編集に使用するのと同じアルゴリズムです。

Understanding and Applying Operational Transformationおよび付添いhacker newsの議論はおそらく他の良い出発点です。

Wave Protocolはオープ​​ンソースとして公開されているため、その実装方法を確認することができます。

もちろん、ややこしい同期を避けて、一度に1人だけがドキュメントを編集でき、この人がグループの残りの部分に変更をプッシュするだけです。

関連する問題