Что такое Server-Sent Events (SSE)?
Server-Sent Events (SSE) — это технология, позволяющая серверу отправлять обновления клиенту через однонаправленное соединение по протоколу HTTP. SSE используется для потоковой передачи данных, например, уведомлений, обновлений чатов и данных в реальном времени.
Как работает SSE?
EventSource
.text/event-stream
.Пример реализации SSE
1. Серверная часть (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");
setInterval(() => {
res.write(`data: ${JSON.stringify({ time: new Date().toISOString() })}\n\n`);
}, 3000);
});
app.listen(3000, () => console.log("SSE сервер запущен на порту 3000"));
2. Клиентская часть (HTML + JavaScript)
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>SSE Пример</title>
</head>
<body>
<h1>Обновления от сервера:</h1>
<div id="messages"></div>
<script>
const eventSource = new EventSource("/events");
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
document.getElementById("messages").innerHTML += `<p>Новое событие: ${data.time}</p>`;
};
eventSource.onerror = () => {
console.error("Ошибка соединения с сервером");
};
</script>
</body>
</html>
Преимущества SSE
Простая реализация — использует стандартный HTTP и JavaScript API.
Поддержка автоматического переподключения (встроена в EventSource
).
Более эффективен, чем периодические AJAX-запросы (polling
).
Поддержка текстового потока (JSON, XML).
Ограничения SSE
Однонаправленность — сервер может только отправлять данные клиенту.
Поддержка только HTTP/1.1, не работает через WebSockets.
Ограничения на количество открытых соединений (6 соединений на домен в большинстве браузеров).
Когда использовать SSE?
- Реальное время для уведомлений, лент новостей, аналитики.
- Потоковые обновления биржевых данных, спортивных событий.
- Логирование и мониторинг серверных процессов.
Если нужно двустороннее общение (сервер ↔ клиент), лучше использовать WebSockets.