EventSource

EventSource 是 HTML5 提供的用于接收服务器推送事件(Server-Sent Events)的接口,它允许服务器通过 HTTP 连接向客户端推送数据,实现服务器到客户端的单向实时通信。用于接收来自服务器的事件流。与 WebSocket 不同,EventSource 是单向通信(服务器到客户端),基于普通的 HTTP 协议。

主要特点

  • 简单易用:基于 HTTP 协议,不需要特殊协议
  • 自动重连:内置连接断开后的重连机制
  • 事件驱动:支持不同类型的事件监听
  • 文本传输:适合传输文本数据(如 JSON)

基本用法

1. 创建 EventSource 连接

const eventSource = new EventSource('事件流URL');2. 监听消息事件eventSource.onmessage = function(event) {
  console.log('新消息:', event.data);
};3. 监听自定义事件eventSource.addEventListener('customEvent',
    function (event) {
        console.log('自定义事件:', event.data);
    }
);4. 错误处理eventSource.onerror = function() {
   console.error('连接出错');
};事件流格式服务器返回的事件流应该是 text/event-stream 格式,每个消息由一对换行符分隔。

示例格式:

event: notification data: 这是一条通知消息 data: 这是一条普通消息 data: 这是一条注释API 详解构造函数new EventSource(url, configuration);

  • url:事件源URL
  • configuration(可选):配置对象,目前只有一个属性:withCredentials:布尔值,表示是否应发送凭据(如cookie)

属性

  • readyState:只读,连接状态0 (CONNECTING):连接尚未建立
  • 1 (OPEN):连接已建立
  • 2 (CLOSED):连接已关闭
  • url:只读,事件源的URL
  • withCredentials:是否使用凭证
  • lastEventId:只读,最后接收到的事件的ID

方法

  • close():关闭连接

事件

  • onopen:连接打开时触发
  • onmessage:接收到消息时触发
  • onerror:发生错误时触发

服务器实现要求

服务器响应需要设置以下头部:

Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive浏览器兼容性EventSource 在所有现代浏览器中都得到支持,包括:

  • Chrome 6+
  • Firefox 6+
  • Safari 5+
  • Edge 79+
  • Opera 11+

注意:Internet Explorer 不支持 EventSource。

示例代码

客户端代码示例

基本特性

  • 异步通信:可以在后台发送和接收数据,不阻塞用户界面
  • 支持多种协议:HTTP、HTTPS、file、ftp等
  • 支持多种数据格式:XML、JSON、HTML、纯文本等
  • 跨域请求:通过 CORS (Cross-Origin Resource Sharing) 支持跨域请求

基本用法

基本语法结构

ient.connect(handleMessage);
        });

        document.getElementById('disconnect').addEventListener('click', () => {
            sseClient.disconnect();
        });

 对比汇总  特性EventSourceFetch + StreamXMLHttpRequest  设计目的专为 SSE 设计通用网络请求传统网络请求  API 风格事件监听Promise + 流回调式  自动重连✅ 内置❌ 需手动实现❌ 需手动实现  事件解析✅ 自动❌ 手动实现❌ 手动实现  自定义头部❌ 不可用✅ 完全支持✅ 支持  HTTP 方法❌ 仅 GET✅ 所有方法✅ 所有方法  二进制数据❌ 不支持✅ 支持✅ 支持  进度事件❌ 不支持❌ 不支持✅ 支持  超时控制❌ 不支持✅ 通过 Abort✅ 内置  CORS 灵活性一般高一般  内存管理✅ 自动❌ 手动管理❌ 手动管理  浏览器支持IE ❌ 其他 ✅较新浏览器 ✅所有浏览器 ✅  实现复杂度非常简单中等复杂  推荐指数⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

微信小程序中接入示例