SSE(Server-Sent Events) 服务端推送技术深度剖析

随着 Web 技术的不断发展,越来越多的应用需要实现实时通信。传统的轮询技术明显存在性能问题,WebSocket 技术虽然弥补了这个问题,但使用起来更为复杂。而 SSE(Server-Sent Events)服务端推送技术则提供了一种轻量级的、简单易用的实时通信解决方案。本文将对 SSE 技术进行深入剖析,包括其原理、应用场景、使用方法和示例代码等内容。

原理

SSE 技术基于 HTTP 协议,利用 HTTP/1.1 中的持久连接技术实现服务端向客户端实时推送数据。客户端通过建立一个长连接,然后等待服务端推送数据。服务端可以随时向客户端发送数据,每次发送的数据格式是一段以“data: ”开头的 UTF-8 编码的文本。客户端接收到数据后,解析其中的文本信息并进行相应处理。

应用场景

SSE 技术可以实现一些实时性要求不高但需要及时更新的场景,比如股票行情、天气预报、在线聊天等。与 WebSocket 技术相比,SSE 技术实现更为简单,并且兼容性更广,能够在现有的 Web 架构中灵活使用。

使用方法

在服务端,需要设置 HTTP 头信息,包括 MIME 类型和缓存控制等。在 Node.js 中可以使用 res.writeHead() 方法设置头信息。同时需要向客户端发送数据,数据格式可以是任意的文本,但需要以“data: ”开头并以“\n\n”结束。在 Node.js 中可以使用 res.write() 方法发送数据。

在客户端,需要创建一个 EventSource 对象,并监听 message 事件。当服务发送事件时,该事件会被触发,同时可以通过 event.data 属性获取服务端发送的数据。需要注意的是,SSE 对象只能与同域名下的服务器通信。

示例代码如下:

// 服务端代码
const http = require('http')
const fs = require('fs')
const path = require('path')

const server = http.createServer((req, res) => {
  if (req.url === '/sse') {
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    })

    setInterval(() => {
      const now = new Date()
      res.write(`data: ${now.toLocaleTimeString()}\n\n`)
    }, 1000)
  } else {
    res.writeHead(200, { 'Content-Type': 'text/html' })
    const html = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8')
    res.end(html)
  }
})

server.listen(8000, () => {
  console.log('SSE server is running at http://localhost:8000')
})

// 客户端代码
const es = new EventSource('/sse')
es.addEventListener('message', (event) => {
  console.log(`Received: ${event.data}`)
})

总结

SSE 技术是一种轻量级的、简单易用的实时通信解决方案,可以实现一些实时性要求不高但需要及时更新的场景。同时,与 WebSocket 技术相比,SSE 技术实现更为简单,并且兼容性更广,能够在现有的 Web 架构中灵活使用。在使用 SSE 技术时需要注意头信息和数据格式,同时需要在客户端进行监听事件并处理数据。

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