
我们在实现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,使用起来极其简单没有复杂的连接状态管理,没有心跳检测,更没有手动重连逻辑。浏览器为你搞定了一切。
下面我们结合一个例子看看它的实现
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端口**‌
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});在client端,我们直接通过new EventSource('/sse') 获取sse连接然后就通过sse.onmessage来接收服务端推送的消息。
在服务端,本质上就是一个普通的http服务器,只不过http头和消息体有些许不同,首先是http头,必须包含下面三个,即要求必须是长连接、不能有浏览器缓存、内容必须是文本格式的事件流。
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',在内容的格式上SSE要求每条消息以data:开头并以双换行符\n\n结尾,格式错误会导致事件丢失
data: 这是有效消息\n\n除了data还有其他几个类型的类容,接收到的每个消息都包含以下字段组合,每个字段占据一行:
event - 用来标识所描述事件类型的字符串。
data - 消息的数据字段。
id - 用于设置 EventSource 对象的最后一个事件 ID 值的事件 ID。
retry - 重连的时间间隔。可以看到,只要我们按照要求来发送和接收消息,就可以非常方便地实现SSE协议,正是由于它非常方便,所以非常适合LLM场景下消息的推送和传递。
本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!