Server-sent Events 实现多用户在线协作应用的方法分析
随着现代网页应用的不断发展,越来越多的应用需要实现多用户在线协作。而一直以来,WebSocket 是实现这一功能的主要手段。WebSocket 可以在客户端和服务器之间建立长期连接,使得实时通信成为可能。但是在一些情况下,WebSocket 并不是很适合。例如,当应用需要有大量的连接时,持续建立和维护这些连接会导致过多的资源消耗。此时,Server-sent Events (SSE) 就可以成为一个好的选择。
SSE 可以在服务器端向客户端推送事件。与 WebSocket 不同的是,SSE 只建立了一个持久连接,而不是多个连接。另外,在 SSE 中实现多用户在线协作,只需要建立一个与服务器的连接。当服务器上的某个事件发生后,它会被推送给所有已连接的客户端。
下面我们将介绍如何利用 SSE 实现多用户在线协作的应用。假设我们要开发一个在线白板应用,多个用户在上面可以绘制和写字。我们将在后端使用 Node.js 并使用 Express 框架实现服务端应用。
- 首先,我们需要安装 express 和 SSE 包。
npm install express npm install sse
- 然后编写一个服务端文件,其中有三个路由。分别是
/board、/board-data和/board-event。
/board路由是用户访问的页面,这里是在线白板。/board-data路由负责保存和获取当前在线白板的数据。/board-event路由负责 SSE 事件的推送。
// www.javascriptcn.com code example
// server.js
const express = require('express');
const SSE = require('sse');
const app = express();
const boardData = [];
app.get('/board', (req, res) => {
res.sendFile(__dirname + '/board.html');
});
app.get('/board-data', (req, res) => {
res.json(boardData);
});
app.get('/board-event', (req, res) => {
const sse = new SSE(req);
sse.on('connection', (client) => {
client.send('connected');
});
});- 在
board.html中实现前端页面,包括一个可交互的白板和连接到/board-event的 SSE 连接。
// www.javascriptcn.com code example
<!-- board.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>在线白板</title>
<style type="text/css">
.board { border: 1px solid #333; }
</style>
</head>
<body>
<canvas id="board" class="board"></canvas>
<script type="text/javascript">
const board = document.getElementById('board');
const canvas = board.getContext('2d');
const eventSource = new EventSource('/board-event');
eventSource.onmessage = function(event) {
console.log(event.data);
};
</script>
</body>
</html>- 最后,我们需要实现前端和后端的数据传递。当用户绘制或写字时,前端会将数据通过
/board-data保存到后端。后端则将白板数据格式化后通过 SSE 推送给所有客户端。
// www.javascriptcn.com code example
// server.js
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
app.post('/board-data', jsonParser, (req, res) => {
boardData.push(req.body);
sse.send(JSON.stringify(boardData));
res.json({success: true});
});// www.javascriptcn.com code example
// board.html
const boardData = [];
board.onmousedown = function(e) {
// 记录鼠标位置等绘图信息
boardData.push(...);
// 发送数据到服务器
fetch('/board-data', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(boardData)
});
};至此,我们已经完成了使用 Server-sent Events 实现多用户在线协作的应用。通过 SSE 借助 Node.js 实现服务端的事件推送,我们可以轻松地实现多用户之间的实时通信和白板协作。如果您对此有兴趣,可以尝试扩展此应用,实现更多的交互功能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cff097e46428fe9ec460a5