首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SSE 详解

SSE 详解

作者头像
golangLeetcode
发布2026-03-18 18:19:22
发布2026-03-18 18:19:22
2420
举报

我们在实现MCP server的时候,可以通过STDIO方式,更多的是通过SSE方式,那么什么是SSE协议?既然类似长连接方式为什么不直接使用websocket协议呢?下面进行详细介绍:

Server-Sent Events (SSE) 是一种允许服务器通过单个、持久的 HTTP 连接向客户端推送更新的技术。它的魅力在于它的极简主义。

1. 它就是 HTTP,别无其他

与 WebSocket 需要通过 ws:// 协议进行复杂的“升级握手”不同,SSE 完全运行在标准的 HTTP/HTTPS 之上。这意味着:无需特殊的服务器:任何支持 HTTP 长连接的后端框架(Node.js, Python, Go, Java…)都能轻松实现。无缝兼容现有网络:代理、防火墙、负载均衡器都能自然地处理 SSE,因为对它们来说,这只是一个尚未结束的 HTTP 请求。更少的协议开销:没有复杂的帧封装,消息就是纯文本,简单直接。

2. 客户端简单到令人惊喜

在前端,你不需要引入任何第三方库。浏览器原生提供了 EventSource API,使用起来极其简单没有复杂的连接状态管理,没有心跳检测,更没有手动重连逻辑。浏览器为你搞定了一切。

下面我们结合一个例子看看它的实现

代码语言:javascript
复制
const express = require('express');
const app = express();
app.get('/sse', (req, res) => {
    // 设置SSE头部信息,确保连接持久并发送事件流**‌
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
    });
    // 每秒发送一次当前时间到客户端**‌
    const intervalId = setInterval(() => {
        res.write(`data: ${new Date().toLocaleTimeString()}\n\n`);
    }, 1000);
    // 客户端关闭连接时,清除定时器并结束响应**‌
    req.on('close', () => {
        clearInterval(intervalId);
        res.end();
    });
});
// 提供HTML页面,用于显示实时时间**‌
app.get('/', (req, res) => {
    res.send(`
        <h1>SSE 实时时钟</h1>
        <div id="clock"></div>
        <script>
            const clock = document.getElementById('clock');
            const sse = new EventSource('/sse');
            sse.onmessage = (event) => {
                clock.textContent = event.data;
            };
        </script>
    `);
});
// 启动服务器,监听3000端口**&zwnj;
app.listen(3000, () => {
    console.log('服务器运行在 http://localhost:3000');
});

在client端,我们直接通过new EventSource('/sse') 获取sse连接然后就通过sse.onmessage来接收服务端推送的消息。

在服务端,本质上就是一个普通的http服务器,只不过http头和消息体有些许不同,首先是http头,必须包含下面三个,即要求必须是长连接、不能有浏览器缓存、内容必须是文本格式的事件流。

代码语言:javascript
复制
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',

在内容的格式上SSE要求每条消息以data:开头并以双换行符\n\n结尾,格式错误会导致事件丢失

代码语言:javascript
复制
data: 这是有效消息\n\n

除了data还有其他几个类型的类容,接收到的每个消息都包含以下字段组合,每个字段占据一行:

代码语言:javascript
复制
event - 用来标识所描述事件类型的字符串。
data - 消息的数据字段。
id - 用于设置 EventSource 对象的最后一个事件 ID 值的事件 ID。
retry - 重连的时间间隔。

可以看到,只要我们按照要求来发送和接收消息,就可以非常方便地实现SSE协议,正是由于它非常方便,所以非常适合LLM场景下消息的推送和传递。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档