背景:我想创建一个类似记事本的应用程序,其中多个人可以编辑一个文档/记事本。我已经创建了图形界面,现在想开始研究它的多用户协作部分。
问题:如何将文本从一个客户端的文本框转到另一个客户端的文本框。我会使用套接字吗?我将在哪里存储要与所有客户端共享的文本?我必须使用/做什么才能创建一个有效的实时协作文本框。我可以研究的好的起点是什么?
示例: Etherpad.com / Titanpad.com / Piratepad.com或Docs.Google.com (除非我想创建桌面应用程序,而不是网站)
解决答案中出现的一些问题:
用户如何选择要编辑的文档:是
用户如何创建新文档:通过选择主菜单中的新建文件选项
如果多个用户试图同时编辑同一文档,会发生什么情况呢?
用户是否需要单击“保存”按钮才能反映更改?:不,更改应同时反映
用户需要登录吗?:需要
任何人都可以编辑任何文档吗?或者是否有访问限制?文档的创建者可以阻止用户编辑文档。
发布于 2012-05-12 13:13:46
寻找解决方案的第一步是详细定义期望的最终结果。与其只考虑多用户协作部分,不如尝试描述整个用户体验:
< documents?
通过仔细考虑这些设计决策,您最终将得到一些具体的实现问题,然后您可以尝试回答这些问题。
发布于 2012-05-12 13:46:54
你肯定需要看一下etherpad.Especially的源代码,Collab_server.js.That是做了很多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);
}也许这会帮助你一开始。
发布于 2012-05-16 11:14:13
看看Operational transformation,这是谷歌在他们的(已停产的) Wave产品中使用的。在here上查看它们的库的相关链接。
https://stackoverflow.com/questions/10561211
复制相似问题