什么是 Server-Sent Events?
Server-Sent Events(SSE)是一种在客户端和服务器之间实现实时、双向通信的技术。它允许服务器向客户端推送数据,而无需客户端不断地向服务器发送请求。这使得 SSE 成为一种非常适合用于实时应用程序的技术,例如聊天应用程序、实时数据可视化和实时通知等。
SSE 协议基于 HTTP,因此它只需要使用标准的 HTTP 端口(80 或 443)。SSE 通过一个持久的 HTTP 连接来实现数据的推送,这使得 SSE 比传统的轮询技术更加高效和实时。
Node.js 中的 SSE 实现
Node.js 是一个非常适合用于实时应用程序的服务器端技术。Node.js 通过 http
模块提供了 SSE 的实现。
首先,我们需要创建一个 HTTP 服务器:
const http = require('http'); const server = http.createServer((req, res) => { // SSE 实现代码 });
接下来,我们需要设置响应头,告诉客户端我们要发送的是 SSE 数据:
res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive');
然后,我们可以向客户端发送 SSE 数据:
res.write('data: Hello, world!\n\n');
注意,每条 SSE 数据都必须以 data:
开头,并以两个换行符结尾。
最后,我们需要保持连接的持久性,以便服务器可以继续向客户端发送 SSE 数据:
req.socket.setTimeout(Number.MAX_VALUE);
完整的 Node.js SSE 代码示例:
// javascriptcn.com 代码示例 const http = require('http'); const server = http.createServer((req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); res.write('data: Hello, world!\n\n'); req.socket.setTimeout(Number.MAX_VALUE); }); server.listen(3000, () => { console.log('Server listening on port 3000'); });
Ruby on Rails 中的 SSE 实现
Ruby on Rails 是另一个非常适合用于实时应用程序的服务器端技术。Rails 通过 ActionController::Live
模块提供了 SSE 的实现。
首先,我们需要创建一个 SSE 控制器:
// javascriptcn.com 代码示例 class EventsController < ApplicationController include ActionController::Live def index response.headers['Content-Type'] = 'text/event-stream' response.headers['Cache-Control'] = 'no-cache' response.headers['Connection'] = 'keep-alive' response.stream.write("data: Hello, world!\n\n") end end
接下来,我们可以向客户端发送 SSE 数据:
response.stream.write("data: Hello, world!\n\n")
注意,每条 SSE 数据都必须以 data:
开头,并以两个换行符结尾。
最后,我们需要保持连接的持久性,以便服务器可以继续向客户端发送 SSE 数据:
response.stream.close
完整的 Ruby on Rails SSE 代码示例:
// javascriptcn.com 代码示例 class EventsController < ApplicationController include ActionController::Live def index response.headers['Content-Type'] = 'text/event-stream' response.headers['Cache-Control'] = 'no-cache' response.headers['Connection'] = 'keep-alive' response.stream.write("data: Hello, world!\n\n") loop do response.stream.write("data: #{Time.now}\n\n") sleep 1 end response.stream.close end end
总结
Server-Sent Events 是一种非常适合用于实时应用程序的技术,它允许服务器向客户端推送数据,而无需客户端不断地向服务器发送请求。Node.js 和 Ruby on Rails 都提供了 SSE 的实现,我们可以根据自己的需求选择实现方式。无论是在 Node.js 还是 Ruby on Rails 中实现 SSE,都需要设置正确的响应头、向客户端发送 SSE 数据,并保持连接的持久性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65647bdbd2f5e1655ddeedd0