什么是 Server-Sent Events?
Server-Sent Events(SSE)是一种用于在 Web 浏览器和服务器之间实现实时通信的技术。它允许服务器向客户端发送事件流,而客户端可以通过 JavaScript 监听这些事件流并做出相应的处理。SSE 的优点是它可以实现无需轮询的实时通信,这意味着客户端可以立即收到服务器端的更新。
为什么要使用 Server-Sent Events?
在 Web 应用程序中,有许多场景需要实时通信,例如聊天应用程序、在线游戏、股票市场数据等等。传统的实现方法是使用轮询,即客户端每隔一段时间向服务器发起请求,查询是否有更新。但是,这种方法效率低下,因为它会产生大量的网络流量和服务器负载。而使用 SSE 技术则可以避免这些问题,因为它只会在服务器端有更新时才向客户端发送数据。
如何使用 Server-Sent Events?
在客户端,可以使用 JavaScript 来监听 SSE 事件流。以下是一个示例代码:
const source = new EventSource('/sse'); source.addEventListener('message', (event) => { console.log(event.data); });
在服务器端,需要创建一个 SSE 事件流,并向客户端发送事件。以下是一个使用 Node.js 和 Express 框架的示例代码:
const express = require('express'); const app = express(); app.get('/sse', (req, res) => { res.set({ 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); setInterval(() => { const data = new Date().toLocaleTimeString(); res.write(`data: ${data}\n\n`); }, 1000); }); app.listen(3000, () => { console.log('Server started on port 3000'); });
在上面的代码中,服务器会每秒向客户端发送一个包含当前时间的事件。客户端使用 EventSource
对象来监听这些事件,并在控制台中打印出时间。
如何实现任务计划程序?
使用 SSE 技术可以很容易地实现任务计划程序。以下是一个示例代码:
const express = require('express'); const app = express(); app.get('/tasks', (req, res) => { res.set({ 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); const tasks = [ { id: 1, name: 'Task 1', duration: 5000 }, { id: 2, name: 'Task 2', duration: 3000 }, { id: 3, name: 'Task 3', duration: 2000 } ]; let index = 0; const sendTask = () => { const task = tasks[index]; const data = JSON.stringify(task); res.write(`data: ${data}\n\n`); index++; if (index >= tasks.length) { index = 0; } setTimeout(sendTask, task.duration); }; sendTask(); }); app.listen(3000, () => { console.log('Server started on port 3000'); });
在上面的代码中,服务器会向客户端发送一系列任务,并在每个任务完成后等待一段时间再发送下一个任务。客户端可以监听这些任务并在完成后做出相应的处理。
总结
使用 Server-Sent Events 技术可以实现高效的实时通信,避免了传统轮询方法的缺点。它可以用于许多场景,包括任务计划程序。在实现任务计划程序时,我们只需要创建一个 SSE 事件流,并按照一定的规则向客户端发送任务即可。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658becd5eb4cecbf2d13ad86