Made by @matbagnoletti
Docenti: prof.ssa @mciuchetti e prof.ssa Fioroni
Corso TPSIT a.s. 2023/2024, ITTS A. Volta (PG)
Applicazione Java che utilizza i DatagramSocket per implementare una comunicazione UDP unicast e multicast tra più host MulticastPeer.
È possibile visualizzare le versioni già presenti sul proprio dispositivo mediante i seguenti comandi:
java -version
mvn -v
- Scaricare il file compresso del progetto
- Estrarre il progetto
- Eseguire la classe di avvio:
- Tramite IDE
- Tramite terminale:
- Naviga nella root del progetto
- Esegui la build del progetto:
mvn clean install
- Identifica il file
jar
nella directory/target/
- Esegui il programma:
java -cp target/<nome-del-file-jar>.jar chat.RunMe
Il progetto si compone da 5 packages:
- Package comunicazione: Fornisce le classi-entità per la gestione della comunicazione tra
MulticastPeer
. - Package eccezioni: Fornisce una collezione di eccezioni specifiche.
- Package gestione: Fornisce le classi-entità per specifiche operazioni di gestione del programma.
- Package host: Fornisce le classi-entità necessarie alla gestione dei
MulticastPeer
. - Package utenze: Fornisce le classi-entità necessarie alla gestione degli oggetti
Utente
.
Per poter utilizzare il programma è necessario:
- Creare un oggetto
GroupChat
e configurarlo opportunamente; - Creare un oggetto
MulticastPeer
e configurarlo opportunamente con ilGroupChat
precedentemente creato; - Invocare il metodo
MulticastPeer.configura()
e successivamenteMulticastPeer.avvia()
.
Ad esempio:
try {
GroupChat groupChat = new GroupChat("230.19.6.5", 19065);
MulticastPeer multicastPeer = new MulticastPeer("Matteo", false, groupChat);
multicastPeer.configura();
multicastPeer.avvia();
} catch (Exception e) {
ProjectOutput.stampa(e.getMessage(), OutputType.STDERR);
}
Un oggetto GroupChat
necessita di un indirizzo IPv4 di classe D e di un numero di porta valido (0-65535) su cui avviare il MulticastSocket
.
Un oggetto MulticastPeer
necessita, invece, di uno username
, la modalità di log
scelta (true
per abilitare la modalità avanzata, false
altrimenti) e del GroupChat
a cui deve unirsi.
Il programma, tramite un Thread dedicato, sarà in continua attesa di ricevere comandi dall'utente tramite tastiera. L'avviso "# Terminale pronto all'invio di messaggi"
segnalerà la disponibilità del programma a ricevere input dall'utente.
I comandi vengono distinti dai normali messaggi attraverso il carattere $
.
Elenco dei comandi:
$exit
: termina l'esecuzione delMulticastPeer
e del programma.$help
: stampa a video l'elenco dei comandi.$utenti
: stampa a video l'elenco degli utenti memorizzati in rubrica (presenti nel gruppo).$stat
: stampa a video le statistiche riguardo aimessaggi
inviati in output. Tale funzionamento si basa sullo scambio dimessaggi ACK
.$rn
: permette di rinominare un utente memorizzato in rubrica.$log
: abilita e disabilita la modalità dilog
avanzata.
Digitando una generica sequenza di caratteri, invece, il programma interpreterà il testo come un messaggio da comunicare al GroupChat
in modalità multicast.
Dopo che il programma ha opportunamente memorizzato in rubrica un generico utente del GroupChat
dal quale si è ricevuto un generico messaggio, è possibile comunicare in modalità privata (unicast) con esso specificando, dopo il testo del messaggio, il suo nome utente.
Ad esempio:
ciao > usernameDestinatario
Caution
La ricerca degli utenti in rubrica è di tipo case-sensitive: l'utente "matteo" è diverso dall'utente "Matteo".
A ogni MulticastPeer
è associato un oggetto Utente. Per evitare conflitti di username, ogni utente è fornito di un proprio codice univoco UUID
, che viene trasmesso insieme allo username. Attraverso metodi per la verifica dei duplicati, il programma rinominerà automaticamente utenti il cui username non risulta univoco.
Si consiglia di gestire le possibili eccezioni lanciate dal programma tramite il costrutto try-catch
, affidando l'output dell'evento alla classe ProjectOutput
. Il metodo ProjectOutput.stampa()
richiede due parametri: il messaggio di errore e la tipologia di messaggio (in questo caso OutputType.STDERR
). La gestione dei log
è, invece, affidata alla classe ChatLogger
. Per un più consapevole utilizzo di tali classi si consiglia la visualizzazione del package gestione
.
L'intero progetto è stato opportunamente documentato secondo lo standard JavaDoc disponibile nella directory docs. Si consiglia di visualizzare il file index.html attraverso il proprio browser.
Questo progetto (e tutte le sue versioni) sono rilasciate sotto la MB General Copyleft License.