首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java创建实时协作记事本

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

Stack Overflow用户
提问于 2012-05-12 12:59:50
回答 4查看 2.6K关注 0票数 5

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

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

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

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

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

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

如果多个用户试图同时编辑同一文档,会发生什么情况呢?

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

用户需要登录吗?:需要

任何人都可以编辑任何文档吗?或者是否有访问限制?文档的创建者可以阻止用户编辑文档。

EN

回答 4

Stack Overflow用户

发布于 2012-05-12 13:13:46

寻找解决方案的第一步是详细定义期望的最终结果。与其只考虑多用户协作部分,不如尝试描述整个用户体验:

  • 用户如何选择要编辑的文档?
  • 如果多个用户尝试同时编辑同一文档,用户如何创建新代码?
  • 在反映更改之前,用户是否需要单击“保存”按钮?
  • 用户是否需要登录?

< documents?

  • What >H111任何人都可以编辑任何文档,或者是否有access restrictions?

通过仔细考虑这些设计决策,您最终将得到一些具体的实现问题,然后您可以尝试回答这些问题。

票数 2
EN

Stack Overflow用户

发布于 2012-05-12 13:46:54

你肯定需要看一下etherpad.Especially的源代码,Collab_server.js.That是做了很多functionalists.One的主文件,这个文件的主要方法如下,可以查看一下:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-05-16 11:14:13

看看Operational transformation,这是谷歌在他们的(已停产的) Wave产品中使用的。在here上查看它们的库的相关链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10561211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档