Sobes.tech
Junior

Co jsou webové sokety?

sobes.tech AI

Odpověď od AI

Websockets (Websockets) jsou protokol pro obousměrnou komunikaci přes jedno TCP spojení, který umožňuje výměnu dat v reálném čase mezi prohlížečem a serverem.

Klíčové rozdíly oproti tradičním HTTP požadavkům:

  • Obousměrná komunikace: Server může posílat data klientovi bez předchozího požadavku od klienta.
  • Jedno spojení: Naváže se jedno dlouhodobé spojení, čímž se odstraňují náklady na navázání nového spojení pro každý výměnu dat (jako u HTTP).
  • Snížení latence: Méně času se tráví na navázání spojení, výměnu hlaviček a zpracování krátkých požadavků/odpovědí.

Princip fungování:

  1. Handshake: Prohlížeč odešle speciální HTTP požadavek na server (s hlavičkami Upgrade: websocket a Connection: Upgrade).
  2. Navázání spojení: Pokud server podporuje websockety, odpoví s kódem 101 Switching Protocols, po čemž spojení přejde na websocket protokol.
  3. Přenos dat: Po navázání spojení mohou obě strany volně vyměňovat zprávy kdykoliv.

Příklady použití:

  • Online hry
  • Chaty a messengery
  • Reálné aktualizace dat (kurzy, zprávy)
  • Kolaborativní nástroje

Výhody:

  • Nízká latence
  • Efektivní využití zdrojů (méně overheadu)
  • Obousměrná komunikace v reálném čase

Nevýhody:

  • Vyžaduje podporu jak na straně klienta (prohlížeč), tak na straně serveru.
  • Složitější implementace ve srovnání s jednoduchými HTTP požadavky.

Příklad klientského kódu v JavaScriptu:

// vytvoření websocket
const socket = new WebSocket('wss://example.com/websocket');

// handler pro otevření spojení
socket.onopen = function(event) {
  console.log('Spojení navázáno');
  socket.send('Ahoj, server!'); // odeslání zprávy serveru
};

// handler pro příjem zpráv
socket.onmessage = function(event) {
  console.log('Zpráva od serveru: ' + event.data);
};

// handler pro uzavření spojení
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Spojení ukončeno čistě, kód=${event.code} důvod=${event.reason}`);
  } else {
    console.log('Spojení přerušeno'); // například kvůli chybě sítě
  }
};

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

// uzavření spojení (pokud je potřeba)
// socket.close();