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).
- HTTP Upgrade Request: Odjemalec pošlje zahtevo na strežnik z željo po prehodu na protokol `ws://` ali `wss://`.
- Handshake Response: Če strežnik podpira WebSocket, odgovori s kodo 101 Switching Protocols.
- 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.