WebSocket to protokół komunikacyjny, który po jednym uścisku dłoni (handshake) utrzymuje stałe, dwukierunkowe połączenie między przeglądarką a serwerem. W przeciwieństwie do klasycznego HTTP, gdzie klient pyta, a serwer odpowiada i połączenie się zamyka, WebSocket trzyma kanał otwarty. Obie strony mogą wysyłać dane w dowolnym momencie, bez czekania na pytanie. Standard opisuje RFC 6455, a połączenia mają własne schematy adresów: ws:// (zwykłe) i wss:// (szyfrowane TLS, czyli WebSocket po HTTPS).
Jak to działa
Połączenie startuje jako zwykłe żądanie HTTP z nagłówkiem Upgrade: websocket. Serwer odpowiada kodem 101 Switching Protocols i od tej chwili to samo połączenie TCP przestaje gadać po HTTP, a zaczyna przesyłać ramki (frames) WebSocket. Dzięki temu nie trzeba co chwilę otwierać nowych połączeń ani odpytywać serwera w pętli (tzw. polling). Serwer może z własnej inicjatywy wypchnąć dane do klienta, gdy tylko coś się zmieni.
Sprawdza się wszędzie tam, gdzie liczy się komunikacja w czasie rzeczywistym: czaty, powiadomienia, kursy giełdowe i kryptowalut, gry online, wspólna edycja dokumentów, podgląd logów na żywo. Mniej narzutu niż przy ciągłym pytaniu „czy coś nowego?” co sekundę.
Przykład z praktyki
W przeglądarce masz gotowe API. Wystarczy kilka linijek JavaScriptu:
const ws = new WebSocket('wss://example.com/chat');ws.onmessage = (e) => console.log(e.data);ws.send('Cześć!');
Po stronie serwera w Node.js najczęściej sięgniesz po bibliotekę ws albo Socket.IO (ta druga dokłada automatyczne wznawianie połączenia i fallback, gdy WebSocket nie przejdzie). Do szybkiego testu z konsoli przyda się narzędzie websocat — odpowiednik curl dla WebSocketów.
Na co uważać
- To nie HTTP po nawiązaniu. Po handshake’u nie wyślesz już zwykłego żądania REST tym kanałem — to oddzielny mechanizm.
- Połączenia padają. Wi-Fi, proxy, timeouty — musisz sam ogarnąć wznawianie (reconnect) i zwykle
ping/pong, żeby wykryć martwe połączenie. - Używaj
wss://. Zwykłews://leci plaintextem, więc na produkcji to proszenie się o podsłuch. - Mit „WebSocket zawsze lepszy”. Do jednokierunkowych powiadomień serwer→klient często wystarczy lżejszy SSE (Server-Sent Events).
Pojęcia powiązane
HTTP, TCP, handshake, polling i long polling, Server-Sent Events (SSE), Socket.IO, WebRTC, REST API.