2012-05-12 4 views
5

Фон: Я хотел бы создать приложение для заметок в блокноте, в котором несколько человек могут редактировать один документ/блокнот. Я уже создал графический интерфейс и теперь хочу начать исследование части его совместной работы.Создание блокнота в реальном времени в Java

Вопросы: Как получить текст из текстового поля одного клиента, чтобы перейти в текстовое поле другого клиента. Могу ли я использовать сокеты? Где я могу сохранить текст, который будет использоваться всеми клиентами? Что мне нужно будет использовать/делать, чтобы создать действующий текстовый блок в режиме реального времени. Какая хорошая отправная точка, из которой я могу исследовать?

Примеры: Etherpad.com/Titanpad.com/Piratepad.com или Docs.Google.com (за исключением я хочу создать приложение на рабочем столе, а не сайт)

адресация некоторые вопросы, которые возникли в ответах:

Как пользователи выбрать документ, который они хотят изменить: Да

Как пользователи могут создавать новые документы: при выборе Нового варианта файла в главном меню

Что произойдет, если многие пользователи пытаются редактировать того же документа в один раз? : Им разрешено редактировать документ.

Нужно ли пользователю нажать кнопку «Сохранить» до того, как изменения будут отражены? : Нет, изменения должны быть отражены одновременно

Нужно войти в систему? : Да

Может ли кто-нибудь редактировать любой документ или есть ограничения доступа? : Существуют ограничения, т. Е. создатель документа может остановить пользователя от редактирования документов.

ответ

2

Первый шаг в поиске решения - . Определить желаемый конечный результат достаточно подробно. Вместо того, чтобы рассматривать только часть совместной работы с несколькими пользователями, попробуйте описать весь пользовательский интерфейс:

  • Как пользователи выбирают документ, который они хотят отредактировать?
  • Как пользователи создают новые документы?
  • Что произойдет, если многие пользователи попытаются отредактировать один и тот же документ одновременно?
  • Нужно ли пользователю нажать кнопку «Сохранить» до того, как изменения будут отражены?
  • Нужно ли пользователю войти?
  • Может ли кто-нибудь редактировать любой документ или есть ограничения доступа?

Просматривая эти проектные решения, вы, в конечном итоге, столкнетесь с некоторыми конкретными вопросами реализации, которые вы затем можете попытаться ответить.

+0

Я написал очень конкретный «лист строгания программ», отвечая на все эти вопросы. Мой первый шаг - получить простой текстовый файл совместной работы, из которого я могу отказаться. – Singh

+0

Вопрос отредактирован, отвечая на эти конкретные вопросы, – Singh

0

Вам обязательно нужно заглянуть в исходный код etherpad.Especially Collab_server.js .То есть основной файл, который делает много functionalists.One основного метода этого файла выглядит следующим образом может быть стоит проверить:

function applyUserChanges(pad, baseRev, changeset, optSocketId, optAuthor) { 
    // changeset must be already adapted to the server's apool 

    var apool = pad.pool(); 
    var r = baseRev; 
    while (r < pad.getHeadRevisionNumber()) { 
    r++; 
    var c = pad.getRevisionChangeset(r); 
    changeset = Changeset.follow(c, changeset, false, apool); 
    } 

    var prevText = pad.text(); 
    if (Changeset.oldLen(changeset) != prevText.length) { 
    _doWarn("Can't apply USER_CHANGES "+changeset+" to document of length "+ 
      prevText.length); 
    return; 
    } 

    var thisAuthor = ''; 
    if (optSocketId) { 
    var connectionId = getSocketConnectionId(optSocketId); 
    if (connectionId) { 
     var connection = getConnection(connectionId); 
     if (connection) { 
     thisAuthor = connection.data.userInfo.userId; 
     } 
    } 
    } 
    if (optAuthor) { 
    thisAuthor = optAuthor; 
    } 

    pad.appendRevision(changeset, thisAuthor); 
    var newRev = pad.getHeadRevisionNumber(); 
    if (optSocketId) { 
    _getPadRevisionSockets(pad)[newRev] = optSocketId; 
    } 

    var correctionChangeset = _correctMarkersInPad(pad.atext(), pad.pool()); 
    if (correctionChangeset) { 
    pad.appendRevision(correctionChangeset); 
    } 

    ///// make document end in blank line if it doesn't: 
    if (pad.text().lastIndexOf("\n\n") != pad.text().length-2) { 
    var nlChangeset = Changeset.makeSplice(
     pad.text(), pad.text().length-1, 0, "\n"); 
    pad.appendRevision(nlChangeset); 
    } 

    updatePadClients(pad); 

    activepads.touch(pad.getId()); 
    padevents.onEditPad(pad, thisAuthor); 
} 

Возможно, это поможет вам только начать.

+0

Спасибо, что сказал мне, где искать. Я загрузил источник много недель назад, но я не знал, с чего начать искать. – Singh

0

Посмотрите на Operational transformation, что Google использовал для своего (прекращенного) продукта Wave. Проверьте here на соответствующие ссылки на их библиотеки.

0

Ссылка: http://scholar.lib.vt.edu/theses/available/etd-05032001-113750/unrestricted/FinalThesis.pdf Вы можете ознакомиться с этим PDF-файлом. Это дает представление о том, что и как работает совместный редактор. В нем даются подробные сведения об архитектуре и дизайне, которые они используют.
Возможно, это поможет вам только начать.

Смежные вопросы