5

背景:我想创建一个类似记事本的应用程序,其中多人可以编辑一个文档/记事本。我已经创建了图形界面,现在想开始研究它的多用户协作部分。

问题:我如何从一个客户的文本框中获取文本以转到另一个客户的文本框。我会使用套接字吗?我将在哪里存储将与所有客户共享的文本?为了创建一个功能强大的实时协作文本框,我必须使用/做什么。我可以研究的一个好的起点是什么?

示例:Etherpad.com / Titanpad.com / Piratepad.com 或 Docs.Google.com(除了我想创建桌面应用程序,而不是网站)

解决答案中出现的一些问题:

用户如何选择他们想要编辑的文档:是的

用户如何创建新文档:通过选择主菜单中的“新建文件”选项

如果许多用户尝试同时编辑同一个文档会发生什么?: 他们都可以编辑文件。

用户是否需要在更改反映之前单击“保存”按钮?:不,更改应同时反映

用户需要登录吗?: 是的

任何人都可以编辑任何文档,还是有访问限制?: 有限制,即。文档的创建者可以阻止用户编辑文档..

4

4 回答 4

2

寻找解决方案的第一步是足够详细地定义所需的最终结果。不要只考虑多用户协作部分,而是尝试描述整个用户体验:

  • 用户如何选择他们想要编辑的文档?
  • 用户如何创建新文档?
  • 如果许多用户尝试同时编辑同一个文档会发生什么?
  • 用户是否需要在更改反映之前单击“保存”按钮?
  • 用户需要登录吗?
  • 任何人都可以编辑任何文档,还是有访问限制?

通过思考这些设计决策,您最终会遇到一些具体的实现问题,然后您可以尝试回答这些问题。

于 2012-05-12T05:13:46.413 回答
0

这是一个链接http://scholar.lib.vt.edu/theses/available/etd-05032001-113750/unrestricted/FinalThesis.pdf

由于上面的链接似乎已失效,这是一个更新的链接:

https://vtechworks.lib.vt.edu/bitstream/handle/10919/32127/FinalThesis.pdf?sequence=1&isAllowed=y

您可以浏览此 PDF。它让您深入了解协作编辑器的工作原理和方式。它提供了有关他们正在使用的架构和设计的详细信息。
也许这将帮助您开始。

于 2013-09-13T15:56:02.893 回答
0

看看Operational transformation,这是 Google 用于其(已停产)Wave 产品的东西。在此处查看指向其库的相关链接。

于 2012-05-16T03:14:13.127 回答
0

你肯定需要查看 etherpad 的源代码。特别Collab_server.js是。这是一个有很多功能主义者的主文件。这个文件的主要方法之一如下值得检查:

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);
}

可能这会帮助你开始。

于 2012-05-12T05:46:53.513 回答