Что такое Server-Sent Events (SSE) и как они работают

Ответ

Server-Sent Events (SSE) — это технология, которая позволяет веб-серверу отправлять обновления клиенту в одностороннем порядке по одному долгоживущему HTTP-соединению. Как только соединение установлено, сервер может отправлять данные клиенту по мере их появления.

Ключевое отличие от WebSocket в том, что SSE — это однонаправленный канал (сервер → клиент), в то время как WebSocket обеспечивает двунаправленную связь.

Принцип работы:

  1. Клиент отправляет обычный HTTP-запрос на специальный эндпоинт.
  2. Сервер отвечает заголовком Content-Type: text/event-stream и оставляет соединение открытым.
  3. Сервер отправляет сообщения в формате data: <сообщение>nn.

Пример сервера на Python (Flask):

from flask import Flask, Response
import time
from datetime import datetime

app = Flask(__name__)

@app.route('/stream')
def stream():
    def event_stream():
        while True:
            # Отправляем данные в формате SSE
            yield f"data: Текущее время: {datetime.now()}nn"
            time.sleep(1) # Пауза, чтобы не перегружать клиент
    return Response(event_stream(), mimetype='text/event-stream')

Пример клиента на JavaScript:

// Создаем подключение к эндпоинту
const eventSource = new EventSource('/stream');

// Обработчик для получения сообщений
eventSource.onmessage = function(event) {
    console.log('Новое сообщение:', event.data);
};

// Обработчик ошибок
eventSource.onerror = function(err) {
    console.error('Ошибка EventSource:', err);
};

Когда использовать SSE:

  • Для систем уведомлений (нотификации, обновления статусов).
  • Для отображения данных в реальном времени (биржевые котировки, спортивные результаты).
  • Когда не требуется двусторонняя связь с клиентом, что делает SSE проще и легче в реализации, чем WebSocket.

Ответ 18+ 🔞

А, слушай, вот эта штука — Server-Sent Events, или просто SSE. Это ж, блядь, такая технология, когда сервер может в режиме реального времени пинать данные в браузер, а тот сидит и жрёт их, как кот сметану. Всё по одному долгоживущему HTTP-соединению, которое, сука, не закрывается, пока ты не закроешь вкладку или сервер не скажет «всё, пиздец».

Главный прикол, ёпта, в чём отличие от WebSocket? А вот в чём: SSE — это как радио. Сервер вещает, а ты, клиент, только уши развесил и слушаешь. Обратно него не передашь нихуя. А WebSocket — это уже как телефонный разговор, можно болтать в обе стороны. Вот и вся разница, проще пареной репы.

Как это, блядь, работает, внатуре:

  1. Твой браузер, такой весь из себя важный, стучится на специальный адрес на сервере обычным HTTP-запросом.
  2. Сервер, такой хитрожопый, отвечает ему не просто так, а с особым заголовком: Content-Type: text/event-stream. И соединение, сука, не закрывает, а оставляет нараспашку.
  3. И пошло-поехало: сервер начинает сыпать сообщениями в строгом формате: data: <сообщение>nn. Два переноса строки в конце — это святое, без них нихуя не заработает!

Вот, смотри, как это на сервере (Python с Flask) выглядит:

from flask import Flask, Response
import time
from datetime import datetime

app = Flask(__name__)

@app.route('/stream')
def stream():
    def event_stream():
        while True:
            # Вот тут и происходит магия: плюём данные в поток
            yield f"data: Текущее время: {datetime.now()}nn"
            time.sleep(1) # Чуть притормаживаем, а то клиент с ума сойдёт от скорости
    return Response(event_stream(), mimetype='text/event-stream')

А на клиенте (в браузере) всё вообще элементарно:

// Подключаемся к этому самому потоку
const eventSource = new EventSource('/stream');

// Ловим всё, что сервер швыряет
eventSource.onmessage = function(event) {
    console.log('Новое сообщение:', event.data);
    // Можно, например, запихнуть это в интерфейс
};

// На всякий случай ловим косяки
eventSource.onerror = function(err) {
    console.error('Ошибка EventSource:', err);
    // Тут можно попробовать переподключиться, например
};

Так когда же эту технологию, блядь, применять? Да когда угодно, где нужно просто получать обновления, а не диалог вести!

  • Уведомления всякие: пришло новое сообщение, задача изменила статус, заказ готов — сервер пихнул событие, а у тебя на экране всплыло.
  • Данные в реальном времени: курс биткоина упал в пизду, твоя футбольная команда забила гол, температура на сервере подскочила до овердохуища — всё это льётся потоком.
  • Когда двусторонняя связь не нужна. Зачем городить сложный WebSocket, если можно обойтись этой простой, лёгкой, как пёрышко, технологией? Экономия, сука, ресурсов и нервов!

Вот и вся наука. Просто, эффективно, и не надо выёбываться с лишней сложностью.