Sobes.tech
Junior

Čo sú webové sokety?

sobes.tech AI

Odpoveď od AI

Websockets (Websockets) sú protokolom obojsmernej komunikácie cez jedno TCP spojenie, ktorý umožňuje výmenu dát medzi prehliadačom a serverom v reálnom čase.

Kľúčové rozdiely oproti tradičným HTTP požiadavkám:

  • Obojsmerná komunikácia: Server môže posielať dáta klientovi bez predchádzajúcej požiadavky od klienta.
  • Jedno spojenie: Udržiava sa jedno dlhé spojenie, čím sa odstraňujú náklady na vytvorenie nového spojenia pre každú výmenu dát (ako pri HTTP).
  • Zníženie oneskorenia: Menej času sa stráca na nadviazanie spojenia, výmenu hlavičiek a spracovanie krátkych požiadaviek/odpovedí.

Princíp práce:

  1. Handshake: Prehliadač odošle špeciálnu HTTP požiadavku na server (s hlavičkami Upgrade: websocket a Connection: Upgrade).
  2. Vytvorenie spojenia: Ak server podporuje websockets, odpovie s kódom 101 Switching Protocols, po čom spojenie prejde do websocket protokolu.
  3. Prenos dát: Po nadviazaní spojenia môžu obe strany voľne vymieňať správy kedykoľvek.

Príklady použitia:

  • Online hry
  • Čaty a messengery
  • Reálnečasové aktualizácie dát (kurzy, správy)
  • Kolaboratívne nástroje

Výhody:

  • Nízke oneskorenie
  • Efektívne využívanie zdrojov (menší overhead)
  • Obojsmerná komunikácia v reálnom čase

Nevýhody:

  • Vyžaduje podporu na strane klienta (prehliadača) aj na strane servera.
  • Složitejšia implementácia v porovnaní s jednoduchými HTTP požiadavkami.

Príklad klientskeho kódu v JavaScripte:

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

// handler pre otvorenie spojenia
socket.onopen = function(event) {
  console.log('Spojenie nadviazané');
  socket.send('Ahoj, server!'); // odoslanie správy serveru
};

// handler pre prijatie správy
socket.onmessage = function(event) {
  console.log('Prijatá správa od servera: ' + event.data);
};

// handler pre zatvorenie spojenia
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Spojenie čisto zatvorené, kód=${event.code} dôvod=${event.reason}`);
  } else {
    console.log('Spojenie prerušení'); // napríklad kvôli výpadku siete
  }
};

// handler pre chybu
socket.onerror = function(error) {
  console.error(`Chyba websocketu: ${error}`);
};

// zatvorenie spojenia (podľa potreby)
// socket.close();