30 aprile 2022

WebSocket

Il protocollo WebSocket, descritto nelle specifiche RFC 6455 fornisce un mezzo di scambio dati tra server e browser utilizzando una connessione persistente. I dati vengono scambiati in entrambe le direzioni come dei “pacchetti” (packets), senza la necessità di interrompere la connessione o di creare nuovi headers-HTTP per le richieste successive.

I WebSocket sono particolarmente adatti per servizi che richiedono scambi continui di dati, come ad esempio giochi online, sistemi di trading in real-time e così via.

Un semplice esempio

Per aprire una connessione websocket, dobbiamo creare un new WebSocket utilizzando nell’url il protocollo speciale ws:

let socket = new WebSocket("ws://javascript.info");

C’è anche il protocollo criptato wss://, utilizzato per i websockets HTTPS

Scegli sempre wss://

Il protocollo wss:// non solo è criptato, ma è anche più affidabile.

Questo perché i dati del ws:// non sono criptati, visibili per qualunque intermediario. Server proxy molto vecchi, che non riconoscono l’implementazione WebSocket, potrebbero notare i suoi headers, per così dire, “strani” e decidere di interrompere la connessione.

Invece, wss:// è una connessione over TLS (lo stesso di HTTPS che è HTTP over TLS), TLS cripta il dato prima di inviarlo e lo decripta in ricezione. Così i dati passano attraverso i proxy in maniera criptata e non potendone vedere il contenuto lo lasciano passare.

Appena creato il socket, dovremmo rimanere in ascolto su di esso per gli eventi. Ce ne sono 4:

  • open – connessione stabilita (established connection),
  • message – dati ricevuti (data received),
  • error – errore websocket (websocket error),
  • close – connessione chiusa (connection closed).

…E nel caso volessimo inviare qualcosa al server, allora abbiamo il metodo socket.send(data) che si occupa di questo.

Un esempio: