WebSocket — Cheat Sheet

Tag: websocket, realtime, tcp, wss, socket.io, networking

Livello: intermedio

TL;DR: Protocollo di comunicazione full-duplex su singola connessione TCP, ideale per applicazioni real-time a bassa latenza (chat, trading, gaming). Inizia con un handshake HTTP e fa l'upgrade al protocollo ws/wss.

Concetti chiave

-

Connessione persistente e bidirezionale (full-duplex) tra client e server.

-

Opera su livello TCP (porta 80 per ws://, porta 443 per wss://).

-

L'handshake iniziale avviene tramite richiesta HTTP con header Upgrade: websocket.

-

Risolve l'overhead degli header HTTP continui presenti nelle tecniche di long polling.

-

La comunicazione è basata su messaggi (frame), non su stream continui di byte.

-

Supporta l'invio di dati testuali (UTF-8) e binari (ArrayBuffer, Blob).

-

Non include meccanismi nativi di ricollegamento automatico o multiplexing di default.

-

L'API è esposta nativamente in tutti i browser moderni tramite l'oggetto globale WebSocket.

Domande tipiche e risposte pronte

-

Q: Quando sceglieresti WebSocket rispetto a Server-Sent Events (SSE)?R: Scelgo WebSocket se ho bisogno di comunicazione bidirezionale a bassa latenza, come in un gioco. Uso SSE se il flusso dati è strettamente unidirezionale dal server al client.

-

Q: Come gestisci l'autenticazione in una connessione WebSocket?R: Passo un token tramite query string o header personalizzato durante l'handshake HTTP, oppure invio il token come primissimo messaggio subito dopo l'apertura del socket.

-

Q: Come mantieni attiva la connessione se non ci sono dati in transito?R: Implemento un meccanismo di heartbeat con messaggi di ping e pong a intervalli regolari, per evitare che firewall o load balancer chiudano la connessione inattiva.

Insidie e errori comuni

-

Dimenticare di implementare un meccanismo di heartbeat, subendo drop silenziosi della connessione dai proxy.

-

Trascurare il limite di dimensione del payload, non frammentando i messaggi di grandi dimensioni.

-

Non gestire la logica di riconnessione esponenziale (exponential backoff) quando cade temporaneamente la rete.

-

Dimenticare di rimuovere i listener associati all'oggetto WebSocket al momento dello smontaggio dei componenti.

Snippet e comandiTypeScript

```const ws = new WebSocket('wss://api.example.com/stream?token=abc');

ws.onopen = () => {

ws.send(JSON.stringify({ action: 'subscribe', channel: 'market' }));

};

ws.onmessage = (event) => {

const data = JSON.parse(event.data);

console.log('Dati ricevuti:', data);

};

ws.onerror = (error) => {

console.error('Errore WebSocket:', error);

};

ws.onclose = (event) => {

console.log('Chiusura. Codice:', event.code, 'Motivo:', event.reason);

// Logica di riconnessione qui

};

```

Da ripassare

-

[ ] Implementazione del protocollo a livello Node.js puro (es. libreria ws).

-

[ ] Codici di chiusura standard (es. 1000 normale, 1006 anomala).

Riferimenti

-

MDN Web Docs: WebSocket API

-

RFC 6455: The WebSocket Protocol

Jarvis Interviews
Jarvis