Gestione di un Sistema di Talk multiutente Università degli Studi di Roma “La Sapienza” Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica anno accademico 2004-05 Gestione di un Sistema di Talk multiutente Candidato Bruno Aleandri 798026
Applicazione di chat client-server in tecnologia multithread, che prevede: Registrazione dei client presso il server in fase di connessione Creazione di stanze pubbliche con moderatore Possibilità di richiedere una chat privata ad un utente Chat private possono essere accettate, rifiutate o messe in coda Lavagna grafica presente in chat pubbliche e private, con possibilità di caricare immagini di sfondo
SERVER MainThread del server accetta le connessioni dei client che arrivano sul suo ServerSocket Un nuovo thread denominato ClientHandler viene istanziato per ciascun client che si connette Ogni client viene gestito dal proprio ClientHandler fino alla sua disconnessione dal server Server tiene memoria degli utenti connessi e dei talk attivi tramite le proprie strutture dati ConnectionVector e TalkVector Oggetti Connection e Talk rappresentano rispettivamente utenti connessi e talk attivi
ClientHandler di Bruno SERVER Bruno Connection Vector Talk Vector ClientHandler di Bruno Bruno formula1 username: Talk Vector identificativo: Connection Vector Bruno formula1 formula1 Bruno moderatore: Bruno
CLIENT Le classi dell’interfaccia grafica utilizzano i metodi della classe ChatClient per inviare comandi al server a seguito di azioni dell’utente (disaccoppiamento) Classe ChatClient implementa anche un listening thread, che riceve i messaggi dal server ChatClient istanzia un ServiceThread per ogni messaggio ricevuto dal server Un’istanza di ServiceThread processa uno e un solo messaggio ServiceThread aggiorna l’interfaccia grafica tramite i metodi pubblici delle classi di quest’ultima
CLIENT ChatClient SERVER GUI del client ServiceThread
PROTOCOLLO DI COMUNICAZIONE Client e Server seguono le regole di un protocollo di comunicazione per lo scambio di messaggi. Ogni messaggio è costituito da: un codice identificativo con cui distinguere i comandi inviati dal client e le risposte del server un elenco di parametri eventualmente necessari per il processamento della richiesta/risposta Esempio: messaggio di chat inviato nel talk “formula1”: 200 formula1 <testo del messaggio>
STREAM DI OGGETTI Un pixel disegnato sulla lavagna grafica è rappresentato tramite un oggetto della classe LittlePoint. I comandi relativi al disegno devono quindi incapsulare tali oggetti: la classe Message rappresenta il generico comando inviato. Essa è provvista di: un campo stringa, contente il codice identificativo e i parametri di tipo testo un campo LittlePoint, contente l’eventuale pixel ObjectInputStream ed ObjectOutputStream utilizzati per veicolare oggetti Message.
LAVAGNA GRAFICA (1/2) Consente agli utenti partecipanti a talk pubblici e privati di tracciare disegni, anche contemporaneamente. Oltre al tracciamento di punti e linee, è possibile: utilizzare una gomma per cancellare i disegni selezionare colore e spessore del tratto, e la dimensione della gomma caricare un’immagine (JPEG o GIF) come sfondo condiviso della lavagna salvare su file, in formato JPEG, il contenuto della lavagna L’utente può aprire o chiudere la lavagna nell’ambito di ciascun talk.
LAVAGNA GRAFICA (2/2) I pixel disegnati sulla lavagna sono rappresentati dagli oggetti della classe LittlePoint. Oltre alla posizione, alla dimensione e al colore del punto, tali oggetti memorizzano anche l’eventuale immagine che si vuole condividere come sfondo della lavagna. Un campo status è utilizzato per distinguere tra oggetti rappresentanti pixel e quelli contenenti immagini, e per specificare particolari operazioni da effettuare sulla lavagna. Per permettere il refresh della lavagna, ogni utente che disegna è associato ad un vettore di LittlePoint rappresentante la sequenza di punti da lui tracciata. Un ulteriore vettore denominato timeIndex tiene memoria della sequenza con cui gli utenti hanno disegnato.