Blog o spletnem programiranju in elektroniki
💬 👤
back Nazaj na blog
WEB (HTML, CSS, PHP)

Kaj je WebSocket in kako omogoča komunikacijo v realnem času

Klasični spletni protokol HTTP temelji na modelu zahteve in odgovora: odjemalec (brskalnik) mora vedno prvi poslati zahtevo, da od strežnika dobi podatke. Za aplikacije, ki zahtevajo prikaz podatkov v realnem času – kot so spletni klepeti, obvestila v živo, borzni grafi ali spremljanje senzorjev – pa je ta pristop prepočasen. Tukaj nastopi WebSocket, ki vzpostavi dvosmerno povezavo v realnem času.

Razlika med HTTP in WebSocket protokolom

Glavna razlika med obema protokoloma je v načinu vzdrževanja povezave in smeri prenose podatkov.

Značilnost Protokol HTTP Protokol WebSocket
Povezava Kratkotrajna (odpre se za vsako zahtevo in zapre) Trajna (ostane odprta po prvem rokovanju)
Smer komunikacije Enosmerna (samo odjemalec sproži zahtevo) Dvosmerna (Full-Duplex; oba pošiljata podatke)
Zakasnitev (Latency) Večja (zaradi ponavljanja HTTP glave) Izjemno nizka (podatki potujejo takoj)

Kako deluje rokovanje (Handshake)?

Proces vzpostavitve WebSocket povezave se začne z običajno HTTP zahtevo, ki vsebuje posebno zahtevo za nadgradnjo protokola (Upgrade Header).

  1. HTTP Upgrade Request: Odjemalec pošlje zahtevo na strežnik z željo po prehodu na protokol `ws://` ali `wss://`.
  2. Handshake Response: Če strežnik podpira WebSocket, odgovori s kodo 101 Switching Protocols.
  3. Dvosmerni kanal: Povezava ostane odprta. Strežnik lahko zdaj samodejno potisne (push) podatke odjemalcu kadarkoli, ne da bi odjemalec karkoli zahteval.

Primer uporabe WebSocket v JavaScriptu

V brskalniku je uporaba protokola WebSocket izjemno preprosta zahvaljujoč vgrajenemu objektu WebSocket.

// Vzpostavitev povezave s strežnikom WebSocket
const socket = new WebSocket('wss://example.com/socket');

// Odziv ob uspešni povezavi
socket.onopen = function(event) {
  console.log('Povezava WebSocket je vzpostavljena!');
  socket.send(JSON.stringify({ type: 'init', clientId: 42 }));
};

// Sprejemanje podatkov s strežnika v realnem času
socket.onmessage = function(event) {
  const data = JSON.parse(event.data);
  console.log('Novo sporočilo s strežnika:', data);
  
  // Posodobitev elementa na strani takoj ob prejomu podatkov
  document.getElementById('live-status').innerText = data.status;
};

// Obravnava zaprtja povezave
socket.onclose = function(event) {
  console.log('Povezava je zaprta.');
};

Uporaba WebSocket pri Arduino in ESP32 projektih

WebSocket je izjemno priljubljen tudi pri mikrokrmilnikih ESP32. Ko ESP32 deluje kot WebSocket strežnik, lahko na lokalni spletni strani v realnem času osvežujete podatke iz senzorjev (npr. trenutno temperaturo ali porabo električne energije) večkrat na sekundo brez osveževanja brskalnika ali obremenjevanja omrežja.

back Nazaj na blog