Java example

Realizzazione del lato_server

PREMESSA:
Qui di seguito riporto l'elenco delle classi e una breve descrizione dei loro metodi e attibuti.
Mi manterrò ad un livello di astrazione abbastanza alto, in maniera tale da cercare di spiegare il perchè delle mie scelte; se vi interessasse conoscere come ho implementeto le mie idee troverete in allegato anche il codice sorgente, dettagliatamente commentato.
Il diagramma delle classi che potete vedere in fondo a questa pagina è stato realizzato mantenendo un punto di vista a livello di specifica.



Lancia_Server:
A prima vista questa classe può sembrare superflua, in quanto non fà altro che istanziare un ogetto IC dalla classe Ascolta_Chat. Ho deciso di utilizzarla per mantenere un maggiore ordine e una maggiore coerenza; preferisco avere una classe che determini l'entry-point dell'applicazione separata da quella che svolgerà il vero e proprio lavoro di server.
Chiaramente Lancia_Server avrà solo il metodo .main() all'interno del quale, come già detto, istanzierà un oggetto da Ascolta_Chat.
Ascolta_Chat estende Thread, quindi, all'interno del .main() richiamerò il metodo .start().

Ascolta_Chat:
Il vero cuore del lato_server. Estende Thread e importa il package java.net, di quest'ultimo utilizzerà un oggetto ServerSocket. Così facendo è in grado, senza monopolizzare le risorse della macchina, di implementare un ciclo infinito all'interno del quale creerà il Socket-figlio necessario al funzionamento del ServerSocket.
Il Socket-figlio non sarà altro che un istanza della classe Che_Hai_Detto, al quale passeremo in ingresso un puntatore alla classe Registro, precedentemente istanziata.

Che_Hai_Detto:
Estende Thread, in maniera tale da poter essere istanziato ed eseguito ogni volta che uno o più client inviano una richiesta,anche contemporaneamente.
All'interno del metodo run,.start() è stato invocato dalla classe Ascolta_Chat, descrive il Socket-figlio sopra citato. Questo Socket si limiterà a leggere la prima stringa arrivata nella richiesta del client e invocare il conseguente metodo messo a disposizione dal istanza di Registro.

Registro:
La classe Registro contiene il vettore "utenti" nel quale memorizzeremo tutti gli utenti connessi. Viene istanziata da Ascolta_Chat.
Ogni volta che un oggetto della classe Che_Hai_Detto chiama un metodo di Registro, gli passa come argomento le stringhe rimanenti nella richiesta del client.
Registro, prima di effettuare qualunque operazione sul suo vettore o di scorrerlo per fare una notifica agli utenti connessi, controlla che il client da cui ha ricevuto la richiesta sia autorizzato a compiere quella specifica operazione. Se il client ottiene l'autorizzazione, Registro esegue il metodo richiesto, al cui termine creerà un istanza della classe Invia_Messaggio con la quale informerà i client coinvolti dell'operazione eseguita.

Invia_Messaggio:
Anche questa classe importa il package java.net, di cui utilizzerà un oggetto Socket.
Al suo interno, in modo simile a Che_Hai_Detto, che implementava solo flussi di input, sarà costruito un oggetto di tipo PrintWriter grazie al quale potrà spedire messaggi di risposta ai vari client. Per poter inviare un messaggio a tutti gli utenti presenti, richiederà che gli vengano passati in ingresso due array, il primo contenente tutti gli indirizzi IP e il secondo contenente tutte le porte d'ascolto dei client.

 

 


download: (lato_client.zip) (lato_server.zip)