Server-Sent Events (SSE) 是一种服务器推送技术,允许服务器向客户端发送实时更新的数据流。与传统的客户端请求-服务器响应模式不同,SSE 允许服务器在有新数据时主动向客户端推送数据,而不需要客户端不断地轮询服务器。
主要特点:
- 单向通信:SSE 是单向的,即服务器向客户端推送数据,而客户端不能通过 SSE 向服务器发送数据。如果需要双向通信,通常会结合 WebSocket 或其他技术。
- 基于 HTTP:SSE 基于标准的 HTTP 协议,因此它可以在任何支持 HTTP 的环境中使用,不需要额外的协议或库。
- 长连接:SSE 使用长连接(long-lived connection),服务器可以在连接保持打开的情况下持续发送数据。
- 自动重连:如果连接中断,SSE 客户端会自动尝试重新连接服务器,并且可以恢复中断前的数据流。
- 简单易用:SSE 的 API 相对简单,客户端可以使用 JavaScript 的
EventSource
对象来接收服务器推送的事件。
使用场景:
- 实时通知:例如,聊天应用中的新消息通知、股票价格更新、新闻推送等。
- 实时监控:例如,服务器状态监控、日志流式传输等。
- 实时数据更新:例如,实时仪表盘、实时数据可视化等。
示例:
服务器端(使用 Node.js 和 Express):
const express = require('express');
const app = express();
app.get('/events', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
let counter = 0;
const interval = setInterval(() => {
res.write(`data: ${JSON.stringify({ counter: counter++ })}\n\n`);
}, 1000);
req.on('close', () => {
clearInterval(interval);
res.end();
});
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
客户端(使用 JavaScript):
const eventSource = new EventSource('/events');
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Received data:', data);
};
eventSource.onerror = (error) => {
console.error('EventSource failed:', error);
eventSource.close();
};
总结:
HTTP with SSE transport 是一种结合了 Server-Sent Events (SSE) 和 HTTP POST 的通信机制,用于实现服务器与客户端之间的实时消息交换。在这种架构中:
- 服务器到客户端的消息:使用 Server-Sent Events (SSE) 进行传输。SSE 允许服务器在有新数据时主动向客户端推送消息,而不需要客户端不断地轮询服务器。这种单向通信机制非常适合实时通知、数据更新等场景。
- 客户端到服务器的消息:使用 HTTP POST 请求进行传输。客户端可以通过标准的 HTTP POST 请求向服务器发送消息,实现双向通信。
- 消息格式:MCP中所有传输的消息都遵循 JSON-RPC 2.0 协议。JSON-RPC 2.0 是一种轻量级的远程过程调用协议,使用 JSON 格式进行数据交换,具有简单、易用的特点。(参考 AIQL:MCP 模型上下文协议 番外篇 JSON-RPC 2.0)
这种结合 SSE 和 HTTP POST 的通信机制,既利用了 SSE 的实时推送能力,又保留了 HTTP 的广泛兼容性和简单性,适用于需要实时数据更新和双向通信的应用场景。