Przejdź do głównej zawartości

27. WebSocket — komunikacja w czasie rzeczywistym

WebSocket — komunikacja w czasie rzeczywistym

HTTP działa na zasadzie żądanie-odpowiedź: klient pyta, serwer odpowiada, połączenie się zamyka. WebSocket otwiera trwały kanał dwukierunkowy. Serwer może wysyłać dane do klienta bez czekania na zapytanie — idealne dla czatów, powiadomień i gier przeglądarkowych.

  1. Czym różni się WebSocket od HTTP polling? — trwałe połączenie vs ciągłe zapytania
  2. Jak nawiązać połączenie WebSocket w JavaScript?new WebSocket(), eventy
  3. Gdzie używa się WebSocket w praktyce? — czaty, giełdy, gry, dashboardy
  1. Problem: potrzeba danych w czasie rzeczywistym
  2. HTTP polling — jak działa i jakie ma wady (opóźnienie, nadmiar zapytań)
  3. Long polling — ulepszone rozwiązanie, wciąż kompromis
  4. Server-Sent Events (SSE) — jednostronne push od serwera
  5. WebSocket — nawiązanie połączenia (handshake), trwały kanał dwukierunkowy
  6. JavaScript WebSocket API: new WebSocket(), onopen, onmessage, send()
  7. Zastosowania: czat, powiadomienia, live dashboard, gry multiplayer

Schemat porównawczy

HTTP polling vs WebSocket — diagram przepływu danych

Kod JavaScript

Kompletny przykład klienta WebSocket z obsługą eventów

Minimum:

  • Definicja WebSocket i porównanie z HTTP
  • JavaScript WebSocket API (4 eventy)
  • Dwa przykłady zastosowań

Forma: 10 slajdów, 10 minut

Ocena: 3.0
// JavaScript WebSocket Client
const socket = new WebSocket('wss://example.com/chat');
// Połączenie nawiązane
socket.onopen = () => {
console.log('Połączono z serwerem WebSocket');
socket.send(JSON.stringify({ type: 'join', room: 'general' }));
};
// Odebrano wiadomość od serwera
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Wiadomość:', data);
if (data.type === 'message') {
const li = document.createElement('li');
li.textContent = `${data.user}: ${data.text}`;
document.getElementById('messages').appendChild(li);
}
};
// Rozłączono
socket.onclose = (event) => {
console.log('Rozłączono. Kod:', event.code);
};
// Błąd
socket.onerror = (error) => {
console.error('Błąd WebSocket:', error);
};
// Wysyłanie wiadomości
function sendMessage(text) {
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({ type: 'message', text }));
}
}
// Porównanie: HTTP Polling vs WebSocket
// POLLING (stare rozwiązanie):
setInterval(async () => {
const res = await fetch('/api/messages');
const data = await res.json();
updateUI(data);
}, 1000); // Zapytanie co sekundę - marnowanie zasobów!
// WEBSOCKET (nowoczesne rozwiązanie):
const ws = new WebSocket('wss://example.com/messages');
ws.onmessage = (e) => updateUI(JSON.parse(e.data)); // Reaguje natychmiast

Użyj analogii

„Polling to dzwonienie co minutę pytając czy jest list. WebSocket to skrzynka z powiadomieniem SMS.”

Tabela porównawcza

Polling / Long Polling / SSE / WebSocket — latencja, kierunek, złożoność