Creazione di un server di messaggistica utilizzando TCP/IP e Node.JS

Come realizzare da zero un piccolo server TCP/IP per la messaggistica istantanea (chat) utilizzando gli strumenti messi a disposizione da Node.JS

Esempio di chat

Esempio di chat

Come visto a pagina precedente, la creazione di un piccolo server TCP/IP richiede pochissime righe di codice, che tra l’altro assomigliano molto a quelle di un normale server HTTP. Per trasformare il nostro “serverino” TCP/IP in un software capace di realizzare il lato server-side di una chat, dobbiamo apportare qualche modifica. Innanzitutto ci servirà una struttura dati dove memorizzare il numero di socket gestiti dal server. Supponendo ad esempio di avere 10 utenti collegati in chat, avremo un socket per ciascun utente. Ciò significa che il server ascolterà i messaggi ricevuti su tutti e 10 i socket, e poi si occuperà di inoltrarli agli altri client. La soluzione più semplice, anche se non molto professionale, è quella di usare un banale array:

 

 

se conosciamo le API degli array JavaScript, leggere il codice qui sopra dovrebbe essere abbastanza semplice. Le novità più interessanti rispetto all’esempio di pagina precedente riguardano infatti la gestione dell’array, dove memorizziamo tutti i socket aperti dai diversi utenti della chat. In particolare usiamo le funzioni push e splice, praticamente identiche a quelle JavaScript, per rispettivamente aggiungere e rimuovere elementi dall’array. Trattandosi di operazioni tipiche del paradigma JavaScript, non dovrebbe essere necessario approfondirle: se non conosciamo queste funzioni possiamo tranquillamente consultare qualunque documentazione JavaScript.

Oltre alla gestione dell’array, eseguita nell’ambito del paradigma JavaScript, le novità che riguardano strettamente Node.js sono due: l’inoltro dei messaggi ai diversi client, implementato dalla funzione socket.on('data',...), e la gestione della chiusura delle connessione da parte di un client, implementato dalla funzionesocket.on('end',...). Nel primo caso scorriamo semplicemente, con un ciclo for, l’elenco di tutti client attualmente connessi alla chat, escludendo quello corrente per evitare l’effetto dell’eco. Nel secondo caso ci occupiamo di rimuovere il canale di comunicazione chiuso dall’utente dal nostro array: non è necessario fare altro, perché tutta la gestione del protocollo TCP/IP viene svolta dietro le quinte da Node.js. Noi dobbiamo soltanto occuparci di gestire l’inserimento e cancellazione delle connessioni nella struttura dati che abbiamo scelto (in questo caso un array).

Se confrontiamo il codice del server TCP/IP con quello del server HTTP, vedremo che nella versione HTTP non era necessario gestire la chiusura del canale di comunicazione: è proprio questa la differenza principale, dal punto di vista funzionale, tra i due protocolli. Il protocollo TCP/IP si dice “stateful”, perché mantiene aperta la connessione, mentre quello HTTP si dice “stateless”, perché la connessione viene chiusa dopo ogni scambio di informazioni.

Il codice del server, se teniamo conto che stiamo realizzando un sistema di chat, è davvero semplice. Anche in questo caso, per testare il corretto funzionamento del sistema possiamo usare la funzione telnet. Per una verifica “più seria” conviene aprire almeno due finestre del terminale, e controllare che si parlino l’un l’altra. Il codice qui sopra rappresenta solo un esempio per introdurre le potenzialità di Node.js. Chiaramente, se dovessimo implementare sistema di chat professionale, probabilmente vorremmo gestire anche tutti quelli arricchimenti tipici delle chat. Inoltre, sempre nello scenario di un’ipotetica chat professionale, dobbiamo anche ricordarci di gestire tutti i possibili errori e/o situazioni non previste.