SSE — nedir, Server-Sent Events ve tek yönlü akış

Yazar: IT Sectr Yayınlanma: 2026-06-02 Okuma süresi: 8 dk

SSE (Server-Sent Events), sunucunun tek yönlü modda tek bir HTTP bağlantısı üzerinden istemciye akış verileri göndermesine olanak tanıyan bir W3C standardıdır. WebSocket'in aksine, SSE normal HTTP üzerinde çalışır ve istemci tarafında özel bir protokol veya kitaplık gerektirmez. W3C HTML Living Standard (2025) şartnamesine göre, EventSource API, Chrome, Firefox, Safari ve Edge dahil olmak üzere tüm modern tarayıcılarda desteklenmektedir.

Önemli noktalar

  • SSE, sunucudan istemciye HTTP bağlantısı üzerinden tek yönlü veri aktarımı için bir standarttır.
  • EventSource API, harici kitaplıklar olmadan SSE almak için yerleşik bir tarayıcı arayüzüdür.
  • Otomatik yeniden bağlanma — tarayıcı, bağlantı koptuğunda otomatik olarak bağlantıyı yeniden kurar.
  • Metin protokolü — veriler, basit bir metin biçimiyle text/event-stream biçiminde iletilir.
  • Tek yönlü iletişim — SSE, bildirimler, haber akışları, ticker'lar ve izleme için uygundur, ancak sohbet için uygun değildir.

SSE nedir?

SSE (Server-Sent Events), bir web sunucusunun bağlantı kurulduktan sonra istemciye istediği zaman veri göndermesine olanak tanıyan bir teknolojidir. WHATWG tarafından HTML Living Standard'ın bir parçası olarak standartlaştırılmıştır ve MIME türü text/event-stream kullanır. SSE, bir mesaj tanımlayıcısı, olay türü ve yeniden bağlantı gecikmesi belirleme özelliğiyle metin verilerinin iletilmesini destekler.

Çift yönlü protokol ve yükseltme isteği gerektiren WebSocket'in aksine, SSE normal HTTP üzerinde çalışır. Sunucu, Content-Type: text/event-stream başlığını ayarlar, verileri parçalar halinde gönderir ve bağlantıyı açık tutar. İstemci, akışı otomatik olarak ayrıştıran ve olaylar oluşturan tarayıcının EventSource API'si aracılığıyla verileri alır.

CanIUse (2025)'e göre, EventSource API küresel olarak tarayıcıların %97,5'inde desteklenmektedir. Internet Explorer ve bazı mobil tarayıcılarda (sürüm 7.0 öncesi Samsung Internet) desteklenmez. Bu durumlar için, XHR akışı yoluyla EventSource'ı taklit eden polyfill'ler mevcuttur. SSE, HTTP/1.1 boru hattıyla çalışmaz ancak HTTP/2 sunucu göndermesiyle tamamen uyumludur.

Tarihçe ve standartlaştırma

SSE, 2009 yılında Server-Sent DOM Events adı altında HTML5 şartnamesinin bir parçası olarak önerilmiştir. İlk uygulama Opera 9.0'da, ardından Firefox 6.0 (2011), Chrome 9.0 (2011) ve Safari 5.0'da (2010) ortaya çıkmıştır. 2015 yılında şartname, HTML Living Standard'ın ayrı bir bölümüne taşınmıştır. On yıllık geçmişine rağmen, SSE tek yönlü yapısı nedeniyle WebSocket'ten daha az popüler olmaya devam etmektedir.

SSE nasıl çalışır

SSE'nin çalışma mekanizması şöyledir: istemci, sunucu uç noktasının URL'si ile bir EventSource örneği oluşturur. Tarayıcı, Accept: text/event-stream başlığıyla bir GET isteği gönderir. Sunucu, 200 OK durumu ve Content-Type: text/event-stream başlığıyla yanıt verir, ardından event-stream biçiminde veri göndermeye başlar. Sunucu bir sonlandırma sinyali gönderene veya istemci close() çağırana kadar bağlantı açık kalır.

Sunucu tarafında, veriler parçalar halinde (chunked transfer encoding) gönderilir. Her veri parçası, alan satırlarından (event, data, id, retry) oluşan bir metin mesajıdır. Sunucu istediği zaman mesaj gönderebilir, bu da SSE'yi bildirimler ve durum güncellemeleri için ideal hale getirir. Bağlantı, WebSocket gibi sürekli heartbeat paketi alışverişi gerektirmez, ancak retry alanı yeniden bağlanma sıklığını kontrol eder.

Performans testlerine (2024) göre SSE, 256 baytlık mesaj boyutuyla bağlantı başına saniyede 10.000 mesaja kadar verim sağlar. Sunucu tarafında, her SSE bağlantısı yaklaşık 5–10 KB bellek tüketir ve 1 GB RAM ile tek bir sunucunun 50.000'den fazla eşzamanlı bağlantıyı desteklemesine olanak tanır. Bu, ikili protokolün olmaması nedeniyle WebSocket'ten önemli ölçüde daha azdır.

Event-stream biçimi

text/event-stream biçimi, her mesajın yeni satır karakterleriyle ayrılmış adlandırılmış alanlardan oluştuğu basit bir metin protokolüdür. Her alanın biçimi “AlanAdı: değer” şeklindedir. Mesajlar iki yeni satır karakteriyle (\n\n) ayrılır.

Desteklenen alanlar: event (olay türü, varsayılan message), data (veri dizesi, çok satırlı olabilir), id (son olay tanımlayıcısı, Last-Event-ID'de saklanır), retry (milisaniye cinsinden yeniden bağlanma süresi). Yorumlar iki nokta üst üste (:) ile başlar ve ayrıştırıcı tarafından görmezden gelinir, ancak heartbeat için kullanılabilir.

AlanZorunluAmaç
eventHayırOlay türü (varsayılan message)
dataEvetMesaj veri dizesi
idHayırLast-Event-ID için olay tanımlayıcısı
retryHayırms cinsinden yeniden bağlanma gecikmesi

Event-stream örneği

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

İstemcide EventSource API

EventSource API, SSE almak için yerleşik bir tarayıcı arayüzüdür. Bir bağlantı oluşturmak için, uç noktanın URL'si ile kurucuyu çağırmanız yeterlidir. EventSource otomatik olarak bağlantıyı kurar, yeniden bağlanmayı yönetir ve gelen mesajları JavaScript olaylarına ayrıştırır.

EventSource olayları: open (bağlantı kuruldu), message (olay belirtilmeden mesaj alındı), error (bağlantı hatası). Özel olaylar (event: custom) için, olay adıyla addEventListener kullanabilirsiniz. EventSource, yeniden bağlanma sırasında otomatik olarak Last-Event-ID başlığını göndererek sunucunun akışı kaldığı yerden devam ettirmesine olanak tanır.

MDN belgelerine (2025) göre EventSource, CORS ve kimlik bilgisi iletimini (withCredentials) destekler. EventSource, özel başlıklar veya istek gövdesi göndermek için uygun değildir — fetch + ReadableStream ile manuel uygulama gereklidir. EventSource, ikili verileri desteklemez — yalnızca metin ve JSON.

İstemci tarafı JavaScript kodu

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

eventSource.addEventListener('open', () => {
    console.log('SSE bağlantısı açıldı');
});

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

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

eventSource.addEventListener('error', (error) => {
    console.error('SSE hatası:', error);
    // Tarayıcı otomatik olarak yeniden bağlanır
});

// Bağlantıyı kapat
eventSource.close();

SSE vs WebSocket: karşılaştırma

SSE ve WebSocket, gerçek zamanlı iletişim için farklı teknolojilerdir ve her birinin kendi güçlü yönleri vardır. WebSocket, çift yönlü veri alışverişi (sohbet, oyun, işbirlikçi düzenleme) için uygunken, SSE, sunucudan istemciye tek yönlü akışlar (bildirimler, haber akışları, ticker'lar) içindir.

Temel fark, WebSocket'in HTTP/1.1'den WebSocket protokolüne (ws://) bir yükseltme isteği gerektirmesidir ve bu, kurumsal proxy'ler tarafından engellenebilir. SSE, normal HTTP üzerinde çalışır, herhangi bir proxy'den geçer ve özel sunucu yapılandırması gerektirmez. SSE'nin uygulanması da daha basittir — sunucunun ek bir kitaplığa ihtiyacı yoktur, sadece HTTP yanıtını doğru şekilde biçimlendirmek yeterlidir.

Karşılaştırmalı testlere (2024) göre, tek bir sunucu işleminde SSE, daha basit protokol sayesinde WebSocket'ten %30–50 daha fazla bağlantıyı destekler. Ancak SSE'nin gecikmesi daha yüksektir (50–200 ms'ye karşı WebSocket için 10–50 ms) çünkü SSE, ikili çerçevelere sahip tam çift yönlü bir akış yerine parçalı HTTP kullanır.

ÖzellikSSEWebSocket
YönSunucu → istemciÇift yönlü
ProtokolHTTP (text/event-stream)ws:// / wss:// (RFC 6455)
Tarayıcılar%97,5 (yerleşik EventSource)%97 (yerleşik WebSocket)
VeriYalnızca metin / JSONMetin + ikili (Blob, ArrayBuffer)
Proxy işlemeHerhangi bir proxy'den geçerProxy yapılandırması gerektirir
Yeniden bağlanmaOtomatik (tarayıcı)Manuel uygulama
GeçmişLast-Event-IDYerleşik geçmiş yok

Sunucuda SSE nasıl uygulanır

Sunucuda SSE uygulamak için kitaplık gerekmez — sadece doğru HTTP başlıklarını ayarlayın ve text/event-stream biçiminde veri gönderin. Yerleşik http modülünü kullanan Node.js örneğine bakalım. Sunucu, Content-Type ve Cache-Control başlıklarını ayarlar, ardından her N saniyede bir mesaj gönderir.

MDN Web Docs'a (2025) göre, SSE için gerekli başlıklar şunlardır: Content-Type: text/event-stream, Cache-Control: no-cache ve Connection: keep-alive. Cache-Control olmadan, tarayıcı SSE akışını önbelleğe alabilir ve bu da teslimatı durdurur. Connection: keep-alive, tarayıcıya bağlantıyı açık tutmasını açıkça belirtir.

Node.js'de sunucu kodu

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: {"time": "${new Date().toISOString()}", "id":${eventId}}\n\n`);
    }, 2000);

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

Python'da (Flask) SSE

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')

Mobil uygulamalarda SSE

Mobil uygulamalarda SSE kullanımı, iOS ve Android için yerel EventSource uygulamasının olmaması nedeniyle sınırlıdır. Mobil platformlarda, SSE üçüncü taraf kitaplıklar aracılığıyla uygulanır: iOS'ta — URLSession ile NSURLProtocol aracılığıyla, Android'de — OkHttp ile SSE desteği (okhttp-sse) aracılığıyla. React Native ve Flutter için, EventSource'ı taklit eden paketler mevcuttur.

iOS'ta, yerel SSE uygulaması URLSessionDataDelegate aracılığıyla mümkündür. urlSession(_:dataTask:didReceive:) yönteminde veri alındığında, uygulama bir arabellek biriktirir ve event-stream biçimini manuel olarak ayrıştırır. iOS geliştirme bloguna (2024) göre, heartbeat paketlerinin olmaması nedeniyle iOS'ta SSE ile pil tüketimi, sürekli WebSocket bağlantısına göre %40 daha düşüktür.

Android'de, OkHttp, SSE akışlarına abone olmak için EventSource.Factory sınıfını sağlar. Android uygulamaları, FCM kullanılamadığında bildirimler için veya arka planda veri senkronizasyonu için SSE kullanabilir. Android'de SSE, uzun süreli arka plan görevleri için WorkManager ile iyi çalışır. OkHttp belgelerine (2025) göre, okhttp-sse, özel bir dinleyiciyle otomatik yeniden bağlanmayı destekler.

Sıkça Sorulan Sorular

SSE, WebSocket'ten nasıl farklıdır?

SSE, HTTP üzerinden tek yönlü iletimdir (sunucu → istemci), istemcide kitaplık gerektirmez. WebSocket, ikili protokollü çift yönlü iletimdir. SSE'nin uygulanması daha basittir, WebSocket, istemcinin de veri gönderdiği görevler için uygundur.

SSE ikili verileri destekler mi?

Hayır, SSE yalnızca metin verilerini iletir. İkili veriler (görüntü, ses) için, boyutu %33 artıran Base64 kodlaması gerekir. İkili akışlar için WebSocket kullanmak daha iyidir.

SSE bağlantı kopmalarını nasıl yönetir?

EventSource, bir kopma olduğunda otomatik olarak yeniden bağlanır. Gecikme süresi, akıştaki retry alanı (varsayılan 1000 ms) tarafından ayarlanır. Yeniden bağlanırken, tarayıcı Last-Event-ID başlığını göndererek sunucunun akışı kaldığı yerden devam ettirmesine olanak tanır.

Bir tarayıcı kaç SSE bağlantısını tutabilir?

Her tarayıcının bir alana aynı anda yapılan HTTP bağlantı sayısı için bir sınırı vardır. HTTP/1.1 için — alan başına 6–8 bağlantı, HTTP/2 için — 100'e kadar. SSE tek bir bağlantı kullanır, bu nedenle diğer isteklerle rekabet olmaz.

SSE sohbet için kullanılabilir mi?

SSE yalnızca mesaj almak (gelen) için uygundur. Mesaj göndermek (giden) için ayrı bir HTTP isteği (POST) gerekir. Tam teşekküllü bir sohbet için, tek bir bağlantıda çift yönlü iletişim için WebSocket veya Socket.IO kullanmak daha uygundur.

Özet

  • SSE, ek kitaplıklar olmadan normal bir HTTP bağlantısı üzerinden sunucudan istemciye tek yönlü veri aktarımı için bir standarttır.
  • EventSource API, modern tarayıcıların %97,5'i tarafından desteklenen yerleşik bir tarayıcı arayüzüdür.
  • Basit metin protokolü text/event-stream, event, data, id ve retry alanlarına sahiptir.
  • Otomatik yeniden bağlanma, akışı kaldığı yerden devam ettirmek için Last-Event-ID desteğiyle.
  • Verimlilik — SSE, daha basit protokol sayesinde WebSocket'e kıyasla daha fazla sunucu bağlantısını (50.000+) destekler.
  • Mobil platformlarda SSE, manuel akış ayrıştırmayla OkHttp (Android) veya URLSession (iOS) aracılığıyla uygulanır.
  • Tek yönlü akışlar için (bildirimler, akışlar, ticker'lar) SSE'yi, çift yönlü iletişim için WebSocket veya Socket.IO'yu seçin.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun