2012-05-12 32 views
5

Thông tin cơ bản: Tôi muốn tạo một ứng dụng trông giống như sổ tay trong đó nhiều người có thể chỉnh sửa một tài liệu/notepad. Tôi đã tạo ra giao diện đồ họa và bây giờ muốn bắt đầu nghiên cứu phần cộng tác đa người dùng của nó.Tạo một Cộng tác thời gian thực Notepad trong Java

Câu hỏi: Làm cách nào để nhận văn bản từ hộp văn bản của khách hàng đến hộp văn bản của khách hàng khác. Tôi sẽ sử dụng ổ cắm? Tôi sẽ lưu trữ văn bản sẽ được chia sẻ với tất cả khách hàng ở đâu? Những gì tôi sẽ phải sử dụng/làm để tạo ra một hộp văn bản hợp tác thời gian thực chức năng. Whats một điểm khởi đầu tốt mà từ đó tôi có thể nghiên cứu?

Ví dụ: Etherpad.com/Titanpad.com/Piratepad.com hoặc Docs.Google.com (Trừ tôi muốn tạo ra một ứng dụng desktop, không phải là một trang web)

Phát biểu một số câu hỏi mà đã phát sinh trong câu trả lời:

làm thế nào để người dùng chọn một tài liệu mà họ muốn chỉnh sửa: có

làm thế nào để người dùng tạo tài liệu mới: bằng cách chọn tùy chọn file New trong menu chính

gì xảy ra nếu nhiều người dùng cố gắng chỉnh sửa cùng một tài liệu tại Một lần? : Tất cả đều được phép chỉnh sửa tài liệu.

Người dùng có cần nhấp vào nút "lưu" trước khi thay đổi được phản ánh không? : Không, các thay đổi sẽ được phản ánh đồng thời

Người dùng có cần đăng nhập không? : Có

Có ai có thể chỉnh sửa bất kỳ tài liệu nào hoặc có hạn chế quyền truy cập không? : Có những hạn chế tức là. người tạo tài liệu có thể ngăn người dùng chỉnh sửa tài liệu ..

Trả lời

2

Bước đầu tiên để tìm kiếm giải pháp là xác định kết quả cuối cùng mong muốn đủ chi tiết. Thay vì chỉ xem xét phần cộng tác nhiều người dùng, hãy cố gắng mô tả toàn bộ trải nghiệm người dùng:

  • Người dùng chọn tài liệu họ muốn chỉnh sửa như thế nào?
  • Người dùng tạo tài liệu mới như thế nào?
  • Điều gì sẽ xảy ra nếu nhiều người dùng cố chỉnh sửa cùng một tài liệu cùng một lúc?
  • Người dùng có cần nhấp vào nút "lưu" trước khi thay đổi được phản ánh không?
  • Người dùng có cần đăng nhập không?
  • Có ai có thể chỉnh sửa bất kỳ tài liệu nào hoặc có hạn chế quyền truy cập không?

Bằng cách suy nghĩ thông qua các quyết định thiết kế này, cuối cùng bạn sẽ kết thúc với một số câu hỏi triển khai cụ thể mà bạn có thể thử trả lời.

+0

Tôi đã viết một "Bảng lập kế hoạch chương trình" rất cụ thể trả lời tất cả các câu hỏi đó. Bước đầu tiên của tôi là lấy một hộp văn bản cộng tác đơn giản mà tôi có thể xây dựng. – Singh

+0

Câu hỏi chỉnh sửa trả lời những câu hỏi cụ thể, – Singh

0

Bạn chắc chắn cần phải nhìn vào mã nguồn của etherpad.Especially Collab_server.js Vững đó là file chính mà làm rất nhiều functionalists.One của phương pháp chính của tập tin này là như sau có thể có giá trị kiểm tra:

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

Có thể điều này sẽ giúp bạn bắt đầu.

+0

Cảm ơn bạn đã cho tôi biết nơi để tìm. Tôi đã tải xuống nguồn từ nhiều tuần trước, nhưng tôi không biết bắt đầu từ đâu. – Singh

0

Hãy xem Operational transformation, đó là những gì Google đang sử dụng cho sản phẩm Wave (bị gián đoạn) của họ. Kiểm tra here để biết các liên kết có liên quan đến thư viện của họ.

Các vấn đề liên quan