Yan yana
WebSocketvsServer-Sent Events
WebSocket ile Server-Sent Events arasındaki fark nedir?
Güncellendi 2 dk okuma7 fark
Kısaca
WebSocket, istemci ve sunucunun her an mesaj gönderebildiği iki yönlü bir kanaldır; Server-Sent Events (SSE) ise yalnızca sunucunun güncelleme itmesini sağlar.
WebSocket
WebSocket, tarayıcı ile sunucu arasında tek bir bağlantıyı açık tutarak her iki tarafın istediği an birbirine anında mesaj göndermesini sağlayan protokoldür.
WebSocket sayfasını okuServer-Sent Events
Server-Sent Events, sunucunun tarayıcıya tek bir uzun ömürlü HTTP bağlantısı üzerinden sürekli metin güncellemeleri göndermesini sağlayan web standardıdır.
Server-Sent Events sayfasını okuWebSocket ve Server-Sent Events karşılaştırması
| Özellik | WebSocket | Server-Sent Events |
|---|---|---|
| Yön | İki yönlü: istemci de sunucu da gönderir | Tek yönlü: yalnızca sunucudan istemciye |
| Protokol | HTTP olarak başlar, sonra ws:// ya da wss://'e yükselir | text/event-stream türünde düz HTTP yanıtı |
| Veri türleri | Metin ve ikili mesajlar | Yalnızca UTF-8 metin |
| Yeniden bağlanma | Kendi kodunuzda ele alınmalı | Yerleşik; Last-Event-ID başlığıyla kaldığı yerden devam eder |
| Altyapı | Proxy'ler ve yük dengeleyiciler yükseltmeyi desteklemeli | Standart HTTP sunucuları, proxy'ler ve HTTP/2 ile çalışır |
| Tarayıcı API'si | WebSocket nesnesi | EventSource nesnesi |
| En uygun olduğu yer | Sohbet, çok oyunculu oyunlar, ortak düzenleme | Bildirimler, canlı akışlar, panolar, akıtılan yapay zekâ çıktısı |
Fark, açıklamalı
WebSocket, bir HTTP bağlantısını kalıcı ve tam çift yönlü (full-duplex) bir kanala yükselten bir protokoldür; böylece tarayıcı ve sunucu istedikleri an metin ya da ikili mesaj gönderebilir. Server-Sent Events (SSE) daha basit bir tarayıcı standardıdır: istemci EventSource API'siyle sıradan bir HTTP isteği açar, sunucu da yanıtı açık tutar ve zaman içinde ona olaylar yazar.
Asıl fark yöndür. WebSocket iki yönlüdür ve el sıkışmadan sonra kendi mesaj çerçevelemesine geçer; bu, sohbet, çok oyunculu oyunlar ve ortak düzenleme için uygundur. SSE yalnızca sunucudan istemciye akar ve düz HTTP olarak kalır; bu yüzden mevcut proxy'lerle, kimlik doğrulamayla ve HTTP/2 ile çalışır, akış koparsa tarayıcı da kendiliğinden yeniden bağlanır.
Örtüşen ihtiyaçları karşılarlar ve birçok uygulama bildirimler ya da canlı akışlar için SSE'yi, istemcinin gönderdiği birkaç mesaj için de sıradan fetch isteklerini kullanır. Yapay zekâ modellerinin yanıtlarını bir sohbet arayüzüne akıtmak, SSE tarzı akışların iyi bilinen modern bir kullanımıdır. İstemci de sık ve düşük gecikmeli mesajlar gönderdiğinde WebSocket daha uygun olur.
Sık yapılan bir yanlış, SSE'nin eski olduğu ya da yalnızca bir avuç bağlantıyla sınırlı olduğu düşüncesidir. Alan adı başına altı bağlantı sınırı yalnızca HTTP/1.1 üzerinde geçerlidir; HTTP/2 ya da HTTP/3 üzerinde birçok akış tek bağlantıyı paylaşır. Asıl sınırlar, SSE'nin yalnızca UTF-8 metin taşıması ve yalnızca sunucudan istemciye akmasıdır.
Hangisini kullanmalısınız?
WebSocket şu durumlarda doğru seçim:
- Yalnızca sunucu değil, istemci de sık sık mesaj gönderiyor.
- İkili veriye ya da iki yönde çok düşük gecikmeye ihtiyacınız var.
- Sohbet, çok oyunculu oyunlar ya da gerçek zamanlı iş birliği geliştiriyorsunuz.
Server-Sent Events şu durumlarda doğru seçim:
- Yalnızca sunucunun güncelleme itmesi gerekiyor.
- Ek kod yazmadan otomatik yeniden bağlanma istiyorsunuz.
- Mevcut proxy'ler, kimlik doğrulama ve HTTP/2 ile çalışan düz HTTP'yi tercih ediyorsunuz.
- Bildirimler, günlükler ya da yapay zekâ yanıtları gibi metinleri akıtıyorsunuz.
Tarayıcıda canlı güncellemeleri almak
// WebSocket: both sides can send at any time
const socket = new WebSocket("wss://example.com/chat");
socket.onopen = () => socket.send("Hello, server!");
socket.onmessage = (event) => {
console.log("Server says:", event.data);
};// SSE: the server pushes, the browser only listens
const events = new EventSource("/api/notifications");
events.onmessage = (event) => {
console.log("New update:", event.data);
};
// To send data, the client makes a normal fetch() requestSık sorulan sorular
SSE, WebSocket'ten daha mı iyi?
Genel olarak hiçbiri diğerinden iyi değildir. Yalnızca sunucu veri ittiğinde SSE daha basittir; her iki tarafın da düşük gecikmeyle mesaj göndermesi gerektiğinde ise doğru araç WebSocket'tir.
SSE, HTTP/2 ile çalışır mı?
Evet, orada daha da iyi çalışır; çünkü birçok SSE akışı, her biri kendi bağlantısını gerektirmek yerine tek bir HTTP/2 bağlantısını paylaşabilir.
WebSocket, HTTP ile aynı şey mi?
Hayır. Bir WebSocket bağlantısı HTTP el sıkışmasıyla başlar, ama yükseltmeden sonra istek ve yanıtlar yerine kendi mesaj çerçeveleri protokolünü kullanır.