在Java中创build一个实时协作记事本

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

问题:如何从一个客户端的文本框中获取文本以转到另一个客户端的文本框。 我会使用套接字吗? 我将在哪里存储将与所有客户共享的文本? 我将不得不使用/做什么来创build一个function齐全的实时协作文本框。 这是一个很好的起点,我可以从中研究?

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

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

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

用户如何创build新文档:通过在主菜单中select新文件选项

如果许多用户试图一次编辑同一个文档,会发生什么? :他们都被允许编辑文件。

用户是否需要点击“保存”button才能反映更改? 否,变更应同时反映

用户是否需要login? :是的

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

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

  • 用户如何select他们想要编辑的文档?
  • 用户如何创build新文档?
  • 如果许多用户试图一次编辑同一个文档,会发生什么?
  • 用户是否需要点击“保存”button才能反映更改?
  • 用户是否需要login?
  • 任何人都可以编辑任何文件,或有访问限制吗?

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

您肯定需要查看etherpad的源代码。特别是Collab_server.js 。这是很多function的主要文件。该文件的一个主要方法如下可以值得一提:

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

可能这会帮助你刚开始。

看看Google正在使用的Wave(停产)Wave产品的运营转型 。 在这里查看相关链接到他们的图书馆。

这里有一个链接http://scholar.lib.vt.edu/theses/available/etd-05032001-113750/unrestricted/FinalThesis.pdf你可以通过这个PDF&#x3002; 它让您深入了解协作编辑器的工作原理和方式。 它提供了他们正在使用的架构和devise的细节。
也许这会帮助你开始。