利用 Socket.io 实现多人文本即时编辑:简洁、方便、稳定

文本编辑是应用场景中常见的需求之一,如协同编辑、实时聊天等。当多人同时编辑相同的文本时,即时同步变得必要。本文将介绍如何使用 Socket.io 实现多人文本即时编辑,达到简洁、方便、稳定的效果。

Socket.io 简介

Socket.io 是一个非常流行的基于 Node.js 实时应用程序的库,提供了双向通信协议和可靠的传输机制。它允许客户端和服务器端通过 websockets 进行双向通信,同时还支持数据传输方式如轮询等。

使用 Socket.io 能快速构建实时应用,代码使用简单明了。在实时应用中, Socket.io 可以完成数据的实时传输和同步,实现即时性要求。

环境需求

本文中,我们将使用 Node.js 作为后端环境。在开始前,确保您已经成功安装了 Node.js 和 npm。

安装 Socket.io:

npm install socket.io

实现思路

使用 Socket.io 实现多人文本即时编辑的核心思路是将文本保存在服务器上的文本,所有客户端都从服务器端请求该文本。每当文本更新时,服务器端通过 Socket.io 将更新信息发送到所有打开的客户端。

代码实现

考虑到多人同时编辑文本时需要考虑并发问题,这里我们使用了 ShareDB,它是一个支持多用户在线编辑文档的库。ShareDB 是一个基于 CRDT (CvRDT) 的协作编辑库,支持实现带有用户房间的多实例应用。

服务器端代码

以下是服务器端代码实现:

const http = require('http');
const express = require('express');
const socketIO = require('socket.io');
const ShareDB = require('sharedb');
const WebSocketJSONStream = require('websocket-json-stream');

const backend = new ShareDB();
const connection = backend.connect();
const doc = connection.get('documents', 'mydoc');
if (doc.type === null) {
    doc.create('Hello, World!');
};

const app = express();
const server = http.Server(app);
const io = socketIO(server);

io.on('connection', (socket) => {
    const stream = new WebSocketJSONStream(socket);
    backend.listen(stream);
});

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

server.listen(3000, () => {
    console.log('listening on *:3000');
});

以上代码使用了 ShareDB 库和 WebSocketJSONStream 库来监听客户端连接。一旦连接建立,服务器会创建一个 ShareDB 文档实例,当文档被修改时,它会使用 Socket.io 通知客户端更改。

客户端代码

以下是客户端代码实现:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Socket.io Demo</title>
    <script src="/socket.io/socket.io.js"></script>
  </head>
  <body>
    <div id="editor"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.8/ace.js"></script>
    <script>
      const socket = io();
      socket.on('connect', function() {
          console.log('Connected ');
      });

      socket.on('disconnect', function() {
          console.log('Disconnected');
      });

      const editor = ace.edit('editor');
      editor.session.setMode('ace/mode/markdown');
      editor.$blockScrolling = Infinity;
      console.log(editor.getValue());
      
      const doc = editor.getSession().getDocument();
      doc.on('change', (e) => {
          const change = e.data;
          console.log(change);
          socket.emit('docChange', change);
      });

      socket.on('docChange', (change) => { 
          doc.applyDelta(change);
      });
    </script>
  </body>
</html>

我们在这里使用了 Ace 编辑器,它支持所有主要语言的语法高亮,并包含数百种构建在其上的模式。

客户端代码分为三部分:连接、编辑器设置和文本更改处理。在初始化后,客户端连接到服务器,并在文档修改时通过 Socket.io 发送编辑器更改。

总结

本文介绍了利用 Socket.io 实现多人文本即时编辑的方法,并通过示例代码让读者更好地理解其实现逻辑。开发者可以通过本文快速实现多人文本即时编辑功能,同时,也可以通过相关技术实现别的实时应用场景。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6591b6faeb4cecbf2d6c03c2


纠错反馈