返回

SSE: 无 WebSocket 的服务器端事件

前端

引言

在现代 Web 应用程序中,实时通信对于提供交互式和响应式用户体验至关重要。实现此类通信的一种常见方法是使用 WebSocket,它允许在客户端和服务器之间建立全双工、持续的连接。

然而,并不是所有场景都适合使用 WebSocket。例如,当服务端无法或不愿意建立持久连接时,或者当浏览器不支持 WebSocket 时。在这些情况下,服务器端事件 (SSE) 提供了一种替代方案,它可以在没有 WebSocket 的情况下实现服务器端到浏览器实时推送。

服务器端事件 (SSE)

SSE 是一种基于 HTTP 的协议,它允许服务器通过流的形式向浏览器发送事件。客户端通过打开到服务器的连接并侦听事件流来使用 SSE。服务器可以通过向流中写入事件数据来触发事件,而客户端可以通过注册事件处理程序来接收和处理这些事件。

SSE 与轮询

SSE 通常与轮询进行比较,轮询是一种传统的机制,通过定期向服务器发出请求来检查是否有新数据。与 SSE 不同,轮询需要客户端主动发起请求,这可能会导致延迟和资源浪费。

相反,SSE 是服务器驱动的,这意味着服务器控制何时向客户端推送事件。这消除了轮询的开销,并提供了更实时、更省电的通信机制。

使用 SSE

在实践中使用 SSE 涉及在服务器端和客户端端进行以下步骤:

服务器端:

  1. 设置 SSE 通道: 使用支持 SSE 的 Web 框架或库在服务器端设置 SSE 通道。
  2. 触发事件: 根据需要触发事件,并将事件数据写入 SSE 通道。

客户端:

  1. 打开 SSE 连接: 使用 EventSource API 打开到服务器 SSE 通道的连接。
  2. 注册事件处理程序: 为特定事件类型注册事件处理程序,以便在接收到事件时执行相应的操作。

示例

下面是一个用 Python 使用 Flask 框架实现简单 SSE 服务器的示例:

from flask import Flask, Response

app = Flask(__name__)

@app.route('/sse')
def sse():
    def generate():
        while True:
            yield f"data: {random.randint(1, 100)}\n\n"

    return Response(generate(), mimetype='text/event-stream')

优点和缺点

与其他实时通信机制相比,SSE 有一些优点和缺点:

优点:

  • 无需建立持久连接
  • 服务器驱动的,消除轮询延迟
  • 易于实现和使用

缺点:

  • 浏览器的支持有限(IE 和 Safari 不支持)
  • 仅限于单向通信(从服务器到浏览器)
  • 无法重连,断开连接后需要重新建立

何时使用 SSE

SSE 适用于以下场景:

  • 需要从服务器向浏览器实时推送数据
  • 无法或不愿意建立 WebSocket 连接
  • 浏览器不支持 WebSocket

总结

SSE 提供了一种在没有 WebSocket 的情况下实现服务器端到浏览器实时推送的有效方法。它易于使用、无需持久连接,并且适用于各种场景。虽然它有一些限制,但对于需要在浏览器和服务器之间建立实时通信的应用程序来说,SSE 是一个有价值的选择。