https://github.com/matbagnoletti/multicastudpsocketchat
Applicazione Java che utilizza i DatagramSocket per implementare una comunicazione UDP unicast e multicast tra più MulticastPeer.
https://github.com/matbagnoletti/multicastudpsocketchat
java multicast socket udp
Last synced: 9 months ago
JSON representation
Applicazione Java che utilizza i DatagramSocket per implementare una comunicazione UDP unicast e multicast tra più MulticastPeer.
- Host: GitHub
- URL: https://github.com/matbagnoletti/multicastudpsocketchat
- Owner: matbagnoletti
- License: other
- Created: 2024-05-01T10:33:19.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-01T12:46:22.000Z (about 2 years ago)
- Last Synced: 2025-02-24T16:30:26.613Z (over 1 year ago)
- Topics: java, multicast, socket, udp
- Language: Java
- Homepage:
- Size: 209 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
MulticastUDPSocketChat
Made by @matbagnoletti
Docenti: prof.ssa @mciuchetti e prof.ssa Fioroni
Corso TPSIT a.s. 2023/2024, ITTS A. Volta (PG)
## Descrizione
Applicazione Java che utilizza i DatagramSocket per implementare una comunicazione UDP unicast e multicast tra più host MulticastPeer.
## Requisiti
- [JDK](https://www.oracle.com/it/java/technologies/downloads/) (v21.0.2)
- [Maven](https://maven.apache.org/download.cgi) (v3.9.6)
È possibile visualizzare le versioni già presenti sul proprio dispositivo mediante i seguenti comandi:
```bash
java -version
mvn -v
```
## Installazione e utilizzo
1. Scaricare il file compresso del progetto
2. Estrarre il progetto
3. Eseguire la [classe di avvio](src/main/java/chat/RunMe.java):
- Tramite IDE
- Tramite terminale:
1. Naviga nella root del progetto
2. Esegui la build del progetto: `mvn clean install`
3. Identifica il file `jar` nella directory `/target/`
4. Esegui il programma: `java -cp target/.jar chat.RunMe`
## Struttura e funzionamento
Il progetto si compone da 5 packages:
- Package [comunicazione](src/main/java/chat/comunicazione): Fornisce le classi-entità per la gestione della comunicazione tra [`MulticastPeer`](src/main/java/chat/host/MulticastPeer.java).
- Package [eccezioni](src/main/java/chat/eccezioni): Fornisce una collezione di eccezioni specifiche.
- Package [gestione](src/main/java/chat/gestione): Fornisce le classi-entità per specifiche operazioni di gestione del programma.
- Package [host](src/main/java/chat/host): Fornisce le classi-entità necessarie alla gestione dei [`MulticastPeer`](src/main/java/chat/host/MulticastPeer.java).
- Package [utenze](src/main/java/chat/utenze): Fornisce le classi-entità necessarie alla gestione degli oggetti [`Utente`](src/main/java/chat/utenze/Utente.java).
### Utilizzo
Per poter utilizzare il programma è necessario:
1. Creare un oggetto [`GroupChat`](src/main/java/chat/host/GroupChat.java) e configurarlo opportunamente;
2. Creare un oggetto [`MulticastPeer`](src/main/java/chat/host/MulticastPeer.java) e configurarlo opportunamente con il `GroupChat` precedentemente creato;
3. Invocare il metodo `MulticastPeer.configura()` e successivamente `MulticastPeer.avvia()`.
Ad esempio:
```java
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.
### Interazione con l'utente
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 delMulticastPeere 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 aimessaggiinviati 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à dilogavanzata.
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:
```bash
ciao > usernameDestinatario
```
> [!CAUTION]
>
> La ricerca degli utenti in rubrica è di tipo _case-sensitive_: l'utente _"matteo"_ è diverso dall'utente _"Matteo"_.
### Gestione dei MulticastPeer nel gruppo
A ogni MulticastPeer è associato un oggetto [Utente](src/main/java/chat/utenze/Utente.java). 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`](src/main/java/chat/gestione/ProjectOutput.java). 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`](src/main/java/chat/gestione/ChatLogger.java). Per un più consapevole utilizzo di tali classi si consiglia la visualizzazione del package [`gestione`](src/main/java/chat/gestione).
## Documentazione
L'intero progetto è stato opportunamente documentato secondo lo standard [JavaDoc](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html) disponibile nella directory [docs](/docs). Si consiglia di visualizzare il file [index.html](/docs/index.html) attraverso il proprio browser.
## Licenza d'uso
Questo progetto (e tutte le sue versioni) sono rilasciate sotto la [MB General Copyleft License](LICENSE).