SSE — mi ez, Server-Sent Events és egyirányú streamelés

Szerző: IT Sectr Megjelenés: 2026-06-02 Olvasási idő: 8 perc

SSE (Server-Sent Events) — W3C szabvány, amely lehetővé teszi a szerver számára, hogy egyetlen HTTP-kapcsolaton keresztül egyirányú módban adatfolyamot küldjön a kliensnek. A WebSocket-től eltérően az SSE normál HTTP-n működik, és nem igényel különleges protokollt vagy könyvtárat a kliens oldalán. A W3C HTML Living Standard (2025) specifikációja szerint az EventSource API az összes modern böngészőben támogatott, beleértve a Chrome-ot, Firefox-ot, Safari-t és Edge-t.

Főbb pontok

  • SSE — egyirányú adatátviteli szabvány a szervertől a kliens felé HTTP-kapcsolaton keresztül.
  • EventSource API — beépített böngésző interfész az SSE fogadásához külső könyvtárak nélkül.
  • Automatikus újracsatlakozás — a böngésző automatikusan helyreállítja a kapcsolatot megszakadáskor.
  • Szöveges protokoll — az adatok text/event-stream formátumban kerülnek továbbításra egyszerű szöveges formátumban.
  • Egyirányú kommunikáció — az SSE értesítések, hírfolyamok, tickerek és megfigyelés számára alkalmas, de chat-ekhez nem.

Mi az SSE?

SSE (Server-Sent Events) — technológia, amely lehetővé teszi a web szerver számára, hogy a kapcsolat létrejötte után bármikor adatokat küldjön a kliensnek. A WHATWG szabványosította a HTML Living Standard részeként, és a text/event-stream MIME típust használja. Az SSE támogatja a szöveges adatok továbbítását az üzenetazonosító, az eseménytípus és az újracsatlakozási késleltetés megadásának lehetőségével.

A WebSocket-től eltérően, amely kétirányú protokollt és upgrade kérést igényel, az SSE normál HTTP-n működik. A szerver beállítja a Content-Type: text/event-stream fejlécet, adatokat küld darabokban, és nyitva tartja a kapcsolatot. A kliens a böngésző EventSource API-ján keresztül fogadja az adatokat, amely automatikusan elemzi a folyamot és eseményeket generál.

A CanIUse (2025) adatai szerint az EventSource API globálisan a böngészők 97,5%-ában támogatott. Nem támogatott az Internet Explorerben és néhány mobil böngészőben (Samsung Internet 7.0 verzióig). Ezekre az esetekre vannak polyfill-ek, amelyek XHR streaming segítségével emulálják az EventSource-t. Az SSE nem működik HTTP/1.1 pipelining-gal, de teljesen kompatibilis a HTTP/2 server push-szal.

Történet és szabványosítás

SSE 2009-ben került javaslatra a HTML5 specifikáció részeként Server-Sent DOM Events néven. Az első implementáció az Opera 9.0-ban jelent meg, majd a Firefox 6.0-ban (2011), a Chrome 9.0-ban (2011) és a Safari 5.0-ban (2010). 2015-ben a specifikáció külön szakaszba került a HTML Living Standard-en belül. Az egy évtizedes története ellenére az SSE kevésbé népszerű, mint a WebSocket az egyirányú jellege miatt.

Hogyan működik az SSE

Az SSE működési mechanizmusa a következő: a kliens létrehoz egy EventSource példányt a szerver végpont URL-jével. A böngésző GET kérést küld az Accept: text/event-stream fejléccel. A szerver 200 OK státusszal és a Content-Type: text/event-stream fejléccel válaszol, majd elkezdi küldeni az adatokat event-stream formátumban. A kapcsolat nyitva marad, amíg a szerver termináló jelet nem küld, vagy a kliens meg nem hívja a close()-t.

A szerver oldalán az adatok darabokban kerülnek elküldésre (chunked transfer encoding). Minden adatblokk egy szöveges üzenet, amely mezősorokból áll (event, data, id, retry). A szerver bármikor küldhet üzeneteket, ami az SSE-t ideálissá teszi az értesítések és állapotfrissítések számára. A kapcsolat nem igényel állandó heartbeat csomagcserét (mint a WebSocket), bár a retry mező szabályozza az újracsatlakozás gyakoriságát.

A teljesítménytesztek (2024) adatai szerint az SSE akár 10 000 üzenetet is képes másodpercenként továbbítani kapcsolatonként 256 bájtos üzenetméret mellett. A szerver oldalán minden SSE kapcsolat körülbelül 5–10 KB memóriát fogyaszt, ami lehetővé teszi, hogy egyetlen szerver 50 000+ egyidejű kapcsolatot támogasson 1 GB RAM-mal. Ez jelentősen kevesebb, mint a WebSocket esetében a bináris protokoll hiánya miatt.

Event-stream formátum

Text/event-stream formátum — egyszerű szöveges protokoll, ahol minden üzenet elnevezett mezőkből áll, amelyeket újsor karakterek választanak el. Minden mező „MezőNév: érték” formátumú. Az üzeneteket két újsor karakter ( ) választja el.

Támogatott mezők: event (esemény típusa, alapértelmezett message), data (adatkarakterlánc, lehet többsoros), id (utolsó eseményazonosító, Last-Event-ID-ben tárolva), retry (újracsatlakozási idő ezredmásodpercben). A megjegyzések kettősponttal (:) kezdődnek, és az elemző figyelmen kívül hagyja őket, de használhatók heartbeat-re.

MezőKötelezőCél
eventNemEsemény típusa (alapértelmezett message)
dataIgenAz üzenet adatkarakterlánca
idNemEseményazonosító a Last-Event-ID-hez
retryNemÚjracsatlakozási késleltetés ms-ben

Példa event-stream folyamra

text
: heartbeat comment
event: update
data: {"user": "Alice", "action": "typing"}
id: 1001

event: notification
data: {"type": "info", "text": "New version available"}
data: {"type": "action", "url": "/upgrade"}
retry: 3000

event: close
data: Session ended

EventSource API a kliens oldalán

EventSource API — a böngésző beépített interfésze az SSE fogadásához. A kapcsolat létrehozásához elegendő meghívni a konstruktort a végpont URL-jével. Az EventSource automatikusan létrehozza a kapcsolatot, kezeli az újracsatlakozást, és elemzi a bejövő üzeneteket JavaScript eseményekké.

EventSource események: open (kapcsolat létrejött), message (üzenet érkezett event megadása nélkül), error (kapcsolati hiba). Egyéni eseményekhez (event: custom) használható az addEventListener az esemény nevével. Az EventSource automatikusan elküldi a Last-Event-ID fejlécet újracsatlakozáskor, lehetővé téve a szerver számára a folyam folytatását a megszakítás pontjától.

Az MDN dokumentáció (2025) szerint az EventSource támogatja a CORS-t és a hitelesítő adatok továbbítását (withCredentials). Egyéni fejlécek vagy kéréstörzs küldéséhez az EventSource nem alkalmas — manuális implementáció szükséges fetch + ReadableStream segítségével. Az EventSource nem támogat bináris adatokat — csak szöveget és JSON-t.

Kliens oldali JavaScript kód

js
const eventSource = new EventSource('/api/events/stream');

eventSource.addEventListener('open', () => {
    console.log('SSE kapcsolat megnyitva');
});

eventSource.addEventListener('message', (event) => {
    const data = JSON.parse(event.data);
    console.log('Fogadva:', data);
    renderUpdate(data);
});

eventSource.addEventListener('notification', (event) => {
    const notification = JSON.parse(event.data);
    showNotification(notification.text);
});

eventSource.addEventListener('error', (error) => {
    console.error('SSE hiba:', error);
    // Böngésző automatikus újracsatlakozása
});

// Kapcsolat bezárása
eventSource.close();

SSE vs WebSocket: összehasonlítás

SSE és WebSocket — különböző technológiák valós idejű kommunikációhoz, mindegyiknek megvannak a maga erősségei. A WebSocket kétirányú adatcseréhez (chat-ek, játékok, közös szerkesztés) alkalmas, az SSE egyirányú folyamokhoz a szervertől a kliens felé (értesítések, hírfolyamok, tickerek).

Kulcsfontosságú különbség — a WebSocket upgrade kérést igényel HTTP/1.1-ről a WebSocket protokollra (ws://), amit vállalati proxyk blokkolhatnak. Az SSE normál HTTP-n működik, áthalad minden proxyn, és nem igényel különleges szerver konfigurációt. Az SSE implementációja is egyszerűbb — a szervernek nincs szüksége további könyvtárra, elég a HTTP válasz megfelelő formázása.

Az összehasonlító tesztek (2024) adatai szerint egy szerver folyamaton az SSE 30–50%-kal több kapcsolatot támogat, mint a WebSocket az egyszerűbb protokollnak köszönhetően. Az SSE késleltetése azonban magasabb (50–200 ms szemben a WebSocket 10–50 ms-ával), mert az SSE chunked HTTP-t használ, nem pedig teljes kétirányú folyamot bináris keretekkel.

JellemzőSSEWebSocket
IránySzerver → kliensKétirányú
ProtokollHTTP (text/event-stream)ws:// / wss:// (RFC 6455)
Böngészők97,5% (beépített EventSource)97% (beépített WebSocket)
AdatokCsak szöveg / JSONSzöveg + bináris (Blob, ArrayBuffer)
Proxy kezelésÁthalad minden proxynProxy konfigurációt igényel
ÚjracsatlakozásAutomatikus (böngésző)Manuális implementáció
ElőzményekLast-Event-IDNincs beépített előzmény

SSE megvalósítása a szerveren

SSE megvalósítása a szerveren nem igényel könyvtárakat — elég beállítani a megfelelő HTTP fejléceket és elküldeni az adatokat text/event-stream formátumban. Nézzünk egy példát Node.js-ben a beépített http modul használatával. A szerver beállítja a Content-Type és Cache-Control fejléceket, majd minden N másodpercben üzeneteket küld.

Az MDN Web Docs (2025) szerint a kötelező fejlécek az SSE-hez: Content-Type: text/event-stream, Cache-Control: no-cache és Connection: keep-alive. Cache-Control nélkül a böngésző gyorsítótárazhatja az SSE folyamot, ami a kézbesítés leállásához vezet. A Connection: keep-alive kifejezetten jelzi a böngészőnek, hogy tartsa nyitva a kapcsolatot.

Szerver kód Node.js-ben

js
const http = require('http');

http.createServer((req, res) => {
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive'
    });

    let eventId = 0;
    const interval = setInterval(() => {
        eventId++;
        res.write(`id: ${eventId}\n`);
        res.write(`event: update\n`);
        res.write(`data: {"idő": "${new Date().toISOString()}", "id":${eventId}}\n\n`);
    }, 2000);

    req.on('close', () => {
        clearInterval(interval);
    });
}).listen(3000);

SSE Pythonban (Flask)

python
from flask import Response, Flask
import time
import json

app = Flask(__name__)

@app.route('/stream')
def stream():
    def generate():
        event_id = 0
        while True:
            event_id += 1
            data = json.dumps(
                {'ticker': 'AAPL', 'price': 150.25})
            yield f'id: {event_id}\nevent: price\ndata: {data}\n\n'
            time.sleep(1)
    return Response(generate(),
        mimetype='text/event-stream')

SSE mobil alkalmazásokban

SSE használata mobil alkalmazásokban korlátozott az EventSource natív implementációjának hiánya miatt iOS és Android platformokon. Mobil platformokon az SSE külső könyvtárakon keresztül valósítható meg: iOS-en — URLSession segítségével NSURLProtocol-lel, Androidon — OkHttp SSE támogatással (okhttp-sse). A React Native és Flutter számára elérhetők olyan csomagok, amelyek emulálják az EventSource-t.

iOS-en az SSE natív implementációja URLSessionDataDelegate segítségével lehetséges. Az adatok fogadásakor az urlSession(_:dataTask:didReceive:) metódusban az alkalmazás puffereli, majd manuálisan elemzi az event-stream formátumot. Az iOS fejlesztési blog (2024) szerint az SSE akkumulátorfogyasztása iOS-en 40%-kal alacsonyabb, mint az állandó WebSocket kapcsolaté, a heartbeat csomagok hiánya miatt.

Androidon az OkHttp EventSource.Factory osztályt biztosít az SSE folyamokra való feliratkozáshoz. Az Android alkalmazások használhatják az SSE-t értesítésekhez, amikor az FCM nem elérhető, vagy adatok háttérbeli szinkronizálásához. Az SSE Androidon jól működik a WorkManager-rel hosszú élettartamú háttérfeladatokhoz. Az OkHttp dokumentáció (2025) szerint az okhttp-sse támogatja az automatikus újracsatlakozást egyéni listener-rel.

Gyakran Ismételt Kérdések

Miben különbözik az SSE a WebSocket-től?

SSE — egyirányú adatküldés (szerver → kliens) HTTP-n keresztül, nem igényel könyvtárakat a kliens oldalán. WebSocket — kétirányú adatküldés bináris protokollal. Az SSE egyszerűbben implementálható, a WebSocket olyan feladatokhoz alkalmas, ahol a kliens is küld adatokat.

Támogatja az SSE a bináris adatokat?

Nem, az SSE csak szöveges adatokat továbbít. Bináris adatokhoz (képek, hang) Base64 kódolás szükséges, ami 33%-kal növeli a méretet. Bináris folyamokhoz jobb a WebSocket használata.

Hogyan kezeli az SSE a kapcsolat megszakítását?

EventSource automatikusan újracsatlakozik megszakításkor. A késleltetési időt a retry mező állítja be a folyamban (alapértelmezett 1000 ms). Újracsatlakozáskor a böngésző elküldi a Last-Event-ID fejlécet, lehetővé téve a szervernek a folyam folytatását a megszakítás pontjától.

Hány SSE kapcsolatot tud kezelni egy böngésző?

Minden böngészőnek korlátozása van az egyazon doménnel létesített egyidejű HTTP kapcsolatok számára. HTTP/1.1 esetén — 6–8 kapcsolat doménenként, HTTP/2 esetén — akár 100. Az SSE egy kapcsolatot használ, így nincs versengés más kérésekkel.

Használható az SSE chat-hez?

Az SSE csak üzenetek fogadására alkalmas (bejövő). Üzenetek küldéséhez (kimenő) külön HTTP kérés (POST) szükséges. Teljes chat-hez kényelmesebb a WebSocket vagy Socket.IO használata kétirányú kommunikációval egyetlen kapcsolatban.

Összefoglalás

  • SSE — egyirányú adatátviteli szabvány a szervertől a kliens felé normál HTTP kapcsolaton keresztül, extra könyvtárak nélkül.
  • EventSource API — beépített böngésző interfész, amelyet a modern böngészők 97,5%-a támogat.
  • Egyszerű szöveges protokoll text/event-stream event, data, id és retry mezőkkel.
  • Automatikus újracsatlakozás Last-Event-ID támogatással a folyam megszakítási ponttól való folytatásához.
  • Hatékonyság — az SSE több kapcsolatot (50 000+) támogat a szerveren a WebSocket-hez képest az egyszerűbb protokollnak köszönhetően.
  • Mobil platformokon az SSE OkHttp (Android) vagy URLSession (iOS) segítségével valósítható meg a folyam manuális elemzésével.
  • Egyirányú folyamokhoz (értesítések, hírfolyamok, tickerek) válassza az SSE-t, kétirányú kommunikációhoz — WebSocket vagy Socket.IO.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is