使用Java创建实时协作记事本

5
背景:我想创建一个类似于记事本的应用程序,在其中多个人可以编辑同一个文档/记事本。我已经创建了图形界面,现在想开始研究多用户协作部分。
问题:如何使一个客户端文本框中的文本传递到另一个客户端的文本框中?我应该使用 sockets 吗?在哪里存储将与所有客户端共享的文本?为了创建一个实时协作的文本框,我需要使用/do 什么?从哪里开始研究比较好?
示例:Etherpad.com / Titanpad.com / Piratepad.com 或 Docs.Google.com(除了我想创建一个桌面应用程序,而不是网站)。
回答一些已经出现的问题:
用户如何选择他们想要编辑的文档:是的。
用户如何创建新文档:通过在主菜单中选择“新文件”选项。
如果许多用户同时尝试编辑同一文档会发生什么?:允许他们全部编辑该文档。
在更改反映之前,用户需要点击“保存”按钮吗?:不需要,更改应同时反映出来。
用户需要登录吗?:是的。
任何人都可以编辑任何文档,还是有访问限制?:有限制,即文档的创建者可以阻止用户编辑文档。
4个回答

2
寻找解决方案的第一步是要详细定义所需的最终结果。不仅考虑多用户协作部分,而是试着描述整个用户体验:
  • 用户如何选择他们想编辑的文档?
  • 用户如何创建新文档?
  • 如果许多用户同时尝试编辑同一份文档会发生什么?
  • 在更改反映之前,用户需要点击“保存”按钮吗?
  • 用户需要登录吗?
  • 任何人都可以编辑任何文档吗,还是有访问限制?
通过思考这些设计决策,您最终将得出一些具体的实现问题,然后可以尝试回答这些问题。

我已经撰写了一个非常具体的“程序计划表”,回答了所有这些问题。我的第一步是获得一个简单的协作文本框,以便我可以构建出更多东西。 - Singh

0

0

看一下操作转换,这是谷歌曾经用于他们已停止的Wave产品的技术。点击这里获取相关库的链接。


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

也许这可以帮助你开始。


谢谢您告诉我应该去哪里查找。我几个星期前下载了源代码,但是不知道从哪里开始查找。 - Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接