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.
|