Синхронизировать изменения в текстовое поле - PullRequest
0 голосов
/ 18 ноября 2010

Я экспериментирую с P2P на Flash и столкнулся с небольшим препятствием, которое я хотел бы уточнить, прежде чем двигаться вперед. Сама технология (Flash) не имеет значения для этой проблемы, так как я думаю, что эта проблема возникает на других языках.

Я пытаюсь создать документ, который может редактироваться «вживую» несколькими людьми. Так же, как Google Docs в значительной степени. Но мне интересно, как бы вы предложили синхронизировать текст каждого? Я имею в виду, должен ли я сообщать всем со всем текстом в текстовом поле каждый раз, когда кто-то вносит изменения? Это кажется очень неэффективным.

Я думаю, что должен быть шаблон проектирования, который я могу изучить и реализовать, но я не уверен, с чего начать.

Оптимально, приложение должно отправлять подключенным клиентам только те изменения, которые произошли в документе, и иметь некоторый буфер или исправление ошибок, которые можно использовать для получения более ранних изменений, которые могли быть пропущены. Существует ли какой-либо установленный шаблон проектирования, который имеет дело с этим типом проблемы?

Спасибо, Сандро

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Если требование состоит в том, что каждый может редактировать документ одновременно, и изменения должны быть распространены среди всех, и изменения не должны быть потеряны, то это нетривиальная проблема. Существует несколько различных подходов, но достаточно надежным является Операционная трансформация . Это тот же алгоритм, который Google Docs использует для совместного редактирования.

Понимание и применение операционной трансформации и сопровождающее хакерское сообщение обсуждение, вероятно, другие хорошие места для начала.

Волновой протокол был выпущен как открытый исходный код, поэтому вы можете посмотреть, как он реализован.

Конечно, вы можете отказаться от сложной синхронизации и просто позволить людям по очереди, и только один человек может редактировать документ за раз, и этот человек просто вносит изменения в оставшуюся часть группы.

1 голос
/ 18 ноября 2010

Я думаю, что ваше решение «Оптимально» - это то, что вам нужно.

у каждого текстового поля есть модель, у модели есть история (FILO хранит последние, скажем, 10 значений).каждый раз, когда вы редактируете это текстовое поле, вы помещаете весь текст в модель и отправляете дельту другим подключенным клиентам.поскольку другие клиенты получают данные, они просто выбирают последнее значение из модели и объединяют его с полученными данными.

вы можете усовершенствовать механизм, поместив таймер простоя в середину: когда пользователь что-то вводит вВ текстовом поле вы помечаете эту модель как «toBeSentThroughTheNet» и запускаете таймер.когда таймер «тикает» (TimerEvent.TIMER), вы останавливаете его, собираете помеченные данные и отправляете их другим клиентам.просто не забывайте сбрасывать таймер каждый раз, когда пользователь на самом деле печатает (semplification может быть keydown = reset, keyup = start).

еще одной оптимизацией может быть отправка данных, упакованных в сжатый байт, но это требуетнаписать свой собственный протокол и может быть не так просто и быстро:)

...