WebSocket

Protokół utrzymujący stałe, dwukierunkowe połączenie między przeglądarką a serwerem. Umożliwia komunikację w czasie rzeczywistym, np. w czatach.

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łe ws:// 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.