text/event-stream 是一种 HTTP 内容类型,主要用于服务器向客户端发送实时更新的文本数据,通常在服务器发送事件(Server-Sent Events,SSE)场景中使用。例如,在 GPT 领域中,使用 text/event-stream 来实现将产生的文本不断的提供给前端页面。

基本概念

text/event-stream 是一种基于 HTTP 协议的单向数据传输格式,它允许服务器将实时数据以文本流的形式发送到客户端,客户端可以持续接收服务器推送的新数据,而无需频繁地向服务器发送请求来获取更新。这种方式实现了服务器到客户端的实时通信,在 Web 应用程序中用于实现实时更新、推送通知等功能。

数据格式

text/event-stream 的数据格式由一系列的事件组成,每个事件由若干个字段组成,字段之间通过换行符分隔。每个事件通常以 data: 开头,表示数据字段,后面跟着具体的数据内容。例如:

data: {"message": "Hello, World!"}

data: {"message": "This is a test."}

除了 data 字段外,还可以有其他字段,如 event 字段用于指定事件类型,id 字段用于给事件分配唯一标识符,retry 字段用于指定客户端在连接丢失时的重试时间等。例如:

event: update
data: {"status": "success"}
id: 12345

工作原理

  • 建立连接:客户端通过HTTP请求向服务器发起连接,请求的 Accept 头部字段设置为 text/event-stream,表示客户端希望接收 text/event-stream 格式的数据。服务器接收到请求后,如果支持 text/event-stream,则会建立连接,并开始向客户端发送数据。
  • 数据发送:服务器根据业务逻辑,将数据以 text/event-stream 格式发送到客户端。数据可以是实时生成的,也可以是从数据库或其他数据源获取的。服务器在发送完一条数据后,不会关闭连接,而是等待下一次有数据需要发送时继续发送。
  • 客户端接收:客户端在接收到数据后,会根据 text/event-stream 的格式进行解析,提取出数据内容,并根据业务需求进行处理。客户端会保持连接打开,持续接收服务器发送的新数据。

与 WebSocket 的比较

  • SSE 是基于 HTTP 协议;Websocket 是一种双向的全双工通信协议。
  • SSE 只支持单向的服务器到客户端的数据推送;Websocket 支持双向数据传输。
  • SSE 客户端发送一个包含 Accept: text/event-stream 头部的 HTTP 请求,服务器响应并建立连接;Websocket 需要先基于 HTTP 进行握手后升级为 Websocket 连接。
  • SSE 只能传输文本数据;Websocket 默认支持二进制数据,因此若传输文本需要二次解析。