Sobes.tech
Junior

Czym są WebSockety?

sobes.tech AI

Odpowiedź od AI

Websockets (Websockets) to protokół dwukierunkowej komunikacji przez pojedyncze połączenie TCP, umożliwiający wymianę danych w czasie rzeczywistym między przeglądarką a serwerem.

Kluczowe różnice w porównaniu do tradycyjnych żądań HTTP:

  • Dwukierunkowa komunikacja: Serwer może wysyłać dane do klienta bez uprzedniego żądania od klienta.
  • Jedno połączenie: Ustanawia się jedno długotrwałe połączenie, eliminując koszty tworzenia nowego połączenia dla każdej wymiany danych (jak w HTTP).
  • Zmniejszenie opóźnienia: Mniej czasu poświęca się na ustanowienie połączenia, wymianę nagłówków i obsługę krótkich żądań/odpowiedzi.

Zasada działania:

  1. Handshake: Przeglądarka wysyła specjalne żądanie HTTP do serwera (z nagłówkami Upgrade: websocket i Connection: Upgrade).
  2. Ustanowienie połączenia: Jeśli serwer obsługuje websockety, odpowiada kodem 101 Switching Protocols, po czym połączenie przełącza się na protokół websocket.
  3. Transmisja danych: Po ustanowieniu połączenia obie strony mogą swobodnie wymieniać wiadomości w dowolnym momencie.

Przykłady zastosowania:

  • Gry online
  • Czaty i komunikatory
  • Aktualizacje danych w czasie rzeczywistym (notowania, wiadomości)
  • Narzędzia współpracy

Zalety:

  • Niska latencja
  • Efektywne wykorzystanie zasobów (mniejszy overhead)
  • Dwukierunkowa komunikacja w czasie rzeczywistym

Wady:

  • Wymaga wsparcia zarówno po stronie klienta (przeglądarki), jak i serwera.
  • Bardziej skomplikowana implementacja w porównaniu do prostych żądań HTTP.

Przykład kodu klienta w JavaScript:

// tworzenie websocket
const socket = new WebSocket('wss://example.com/websocket');

// obsługa otwarcia połączenia
socket.onopen = function(event) {
  console.log('Połączenie nawiązane');
  socket.send('Witaj, serwer!'); // wysłanie wiadomości do serwera
};

// obsługa odebrania wiadomości
socket.onmessage = function(event) {
  console.log('Odebrano wiadomość od serwera: ' + event.data);
};

// obsługa zamknięcia połączenia
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Połączenie zamknięte czysto, kod=${event.code} powód=${event.reason}`);
  } else {
    console.log('Połączenie przerwane'); // np. z powodu awarii sieci
  }
};

// obsługa błędów
socket.onerror = function(error) {
  console.error(`Błąd websocket: ${error}`);
};

// zamknięcie połączenia (jeśli konieczne)
// socket.close();