Node.js e websockets

Uno degli ambiti in cui Node.js si trova a suo perfetto agio è nei contesti in cui è necessaria un’alta reattività dei componenti in gioco. Il classico esempio che viene riportato nei tutorial di Node.js è l’implementazione di una chat, in cui i client non fanno polling ma vengono notificati direttamente dal server della presenza di un nuovo messaggio.

Com’è possibile ciò?

Grazie a WebSocket!

Con i WebSocket è possibile stabilire un canale di comunicazione diretto tra il server e il client e viceversa andando quindi oltre il concetto di Request-Response a cui il protocollo HTTP ci ha abituato.

Per utilizzare WebSocket in un’applicazione web dobbiamo avere un browser che lo supporta e possiamo fare affidamento su Firefox, Chrome o Safari. Non su Internet Explorer che solo dalla versione 10 supporterà questa tecnologia.

Fortunatamente ci sono alcune librerie che abbinate a node.js riescono a supportare tutti i browser (anche quelli un po’ datati) grazie a tecniche di fall-back. Ad esempio Socket.io supporta perfino Internet Explorer 5.5.

Socket.io viene distribuita in 2 parti, una parte client da referenziare dalla pagina web e un modulo per node.js per la parte server.

Questa è la parte client che gira nel browser. Il codice si spiega da solo: viene aperta una connessione socket con il server, si sottoscrive ai messaggi server_message e quando ne riceve uno lo appende ad una lista presente nel DOM. La seconda parte serve per inviare un messaggio al server: sul click del pulsante invia un client_message al server il cui contenuto è il testo presente nel controllo HTML.

Lato server la cosa è analoga:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('server_message', { text: 'node rulez!' });
  socket.on('client_message', function (data) {
    console.log(data.text);
  });
});

Anche qui si aspetta una connessione . Tramite il metodo emit invia un  messaggio ai client connessi e tramite il metodo on si sottoscrive ai messaggi dei client (in questo caso stampa sulla console il contenuto).

Quindi la cosa è abbastanza semplice ma apre scenari molto interessanti per chi sviluppa applicazioni web ed è abituato al paradigma Request-Response.

Grazie ai websocket si possono realizzare applicazioni che ricevono notifiche push reali, ottimizzando le performance del server che non è costretto a rispondere ai polling degli n client. Event-based a tutti gli effetti.