Skip to content
小沐沐吖

SSE长连接技术-EventSource

1911 字约 6 分钟

EventSourceSSE

2025-01-07

EventSource

简介

SSE(Server-Sent Events)是一种基于 HTTP 协议,用于实现服务器主动向客户端推送数据的技术。它在客户端与服务器之间建立一条持久化连接,并通过这条连接实现服务器向客户端的实时数据推送,而客户端不能发送数据给服务端

特点

  • 单向通信
  • 实时推送
  • 轻量级
  • 支持跨域、使用简单、支持自动重连

适合场景

  • 数据大屏
  • 消息推送
  • 股票交易
  • 在线聊天

最致命缺点:无法携带自定义请求头Header,只支持Get请求;

简单使用

// 创建 EventSource 实例
const evtSource = new EventSource("http://localhost:3000/events");

// 监听消息
evtSource.onmessage = function (event) {
  console.log("接收到的消息:", event);
};

// 监听连接打开
evtSource.onopen = function () {
  console.log("连接已建立");
};

// 监听错误
evtSource.onerror = function (err) {
  console.error("EventSource 发生错误:", err);
};

🔥SSE.JS

简介

sse.js 是 JavaScript 的灵活 EventSource 替代品(完全兼容的 EventSource polyfill),旨在使用服务器发送事件 (SSE) 流,比标准 EventSource 具有更多的控制和配置。

特点

  • 支持自定义Header
  • 支持POST请求类型

GIthub:sse.js

食用文档

  1. 安装
npm install sse.js
  1. 用法
import { SSE } from "sse.js";

// 创建 SSE 实例
var source = new SSE("http://192.168.7.165:3000/events", {
  headers: {
    "X-App": "MyApp",
    "X-Token": "my-custom-token",
  },
});

// 监听消息
source.onmessage = function (event) {
  console.log("接收到的消息:", event);
};

// 监听连接打开
source.onopen = function () {
  console.log("SSE 连接已建立");
};

// 监听错误
source.onerror = function (err) {
  console.error("EventSource 发生错误:", err);
};

FetchEventSource

简介

FetchEventSource 提供了更多的灵活性和定制能力,能够实现如自动重试、身份验证、自定义事件处理等复杂功能

特点

  • 支持自定义Header

GIthub:FetchEventSource

食用文档

  1. 安装
npm install @microsoft/fetch-event-source
  1. 用法
import { fetchEventSource } from "@microsoft/fetch-event-source";

fetchEventSource("http://192.168.7.165:3000/events", {
  headers: {
    "X-App": "MyApp",
    "X-Token": "my-custom-token",
  },
  onmessage(event) {
    console.log("接收到的消息:", event);
  },
});

EventSourcePolyfill

简介

EventSourcePolyfill是一个用于实现 Server-Sent Events (SSE) 的 polyfill 库;

提供了对不支持原生 EventSource 接口的浏览器的支持,使得开发者可以在所有现代浏览器中使用 SSE 技术。

特点

  • 支持低版本浏览器
  • 支持自定义Header

GIthub:EventSourcePolyfill

食用文档

// 创建 EventSourcePolyfill 实例
const evtSource = new EventSourcePolyfill("http://192.168.7.165:3000/events", {
  headers: {
    "X-App": "MyApp",
    "X-Token": "my-custom-token",
  },
});

// 监听消息
evtSource.onmessage = function (event) {
  console.log("接收到的消息:", event);
};

// 监听连接打开
evtSource.onopen = function () {
  console.log("SSE 连接已建立");
};

// 监听错误
evtSource.onerror = function (err) {
  console.error("EventSource 发生错误:", err);
};

ModernEventSource-自定义实现

实现

JavaScript

食用文档

import ModernEventSource from "./ModernEventSource.js";

const eventSource = new ModernEventSource("http://localhost:3000/events", {
  autoReconnect: true, // 启用自动重连
  reconnectDelay: 2000, // 2秒后重连
  maxReconnectAttempts: 3, // 最多重连3次
  autoManageVisibility: true, // 启用页面可见性管理
  headers: {
    "X-App": "MyApp",
    "X-Token": "my-custom-token",
  },
});

eventSource.onopen = function () {
  console.log("连接已建立");
};

eventSource.onmessage = function (event) {
  console.log("接收到的消息:", event);
};

eventSource.onerror = function (error) {
  console.error("SSE 错误:", error);
};

// 在页面卸载时清理资源
window.addEventListener("unload", () => {
  eventSource.destroy();
});