Indice - Progetto di Reti di Calcolatori - Fabio Adani e Marco Chiesi
Implementazione

MainClient

Questa è la classe principale sul lato client ed ha il compito di gestire sia l'interazione con il server che con l'utente (attraverso l'interfaccia grafica). Si tratta di una classe remota, infatti implementa l'interfaccia IMainClient, la quale presenta un solo metodo

public void serverOff() throws RemoteException;

che serve ad avvisare il client che il server sta andando offline.

Analizziamo ora le variabili presenti all'interno della classe:

Hashtable gamesList; Tabella dei giochi. Ogni entry è costituita dal nome del gioco e dal relativo oggetto GameInfo.
boolean online; Flag che indica se si è connessi
ServerInfo fileServer; Informazioni sul server per il download dei file
IClientAccess clientAccess Interfaccia di accesso al server
IClientAgent clientAgent Agente di comunicazione presso il server
RoomClient roomClient Riferimento al client di chat
MainClientUI ui; Riferimento all'interfaccia utente

Oltre a queste variabili ci sono anche qui dei parametri di configurazione che possono essere impostati dall'utente tramite l'interfaccia grafica. Questi parametri possono anche essere memorizzati su un file di configurazione che di default è denominato netgame.client.properties. A tal proposito si veda anche la gestione dei file di configurazione a livello di server.

UserInfo user; Informazioni sull'utente
ServerInfo server; Informazioni sul server a cui connettersi

La classe ServerInfo è già stata descritta, mentre la classe UserInfo serve per la memorizzazione dei dati di un utente, in sostanza user name e password.

All'interno di MainClient è anche presente un gestore di eventi (classe MainClientEventHandler), addetto alla gestione degli eventi generati dall'interfaccia grafica. Per un elenco completo di tali eventi si veda la classificazione già descritta.

Avvio di un client

Quando il client viene avviato, per prima cosa va a leggere il suo file di configurazione ed imposta i proprio parametri, poi rileva quali giochi sono installati, dopodichè istanzia e visualizza l'interfaccia grafica.

Quando un utente dà il comando di connessione, viene generato un nuovo evento LoginEvent e viene messo nella coda del MainClient. A questo punto il gestore di eventi provvederà a chiamare il metodo login di MainServer, il quale, in caso di successo, restituirà un riferimento remoto ad una classe ClientAgent. Di qui in avanti tutte le comunicazioni saranno fatte attraverso appunto il ClientAgent. In seguito il client richiede la lista dei giochi installati sul server ed anche l'indirizzo del server per il download dei giochi. A questo punto, il giocatore può selezionare uno dei giochi ed accedere alla relativa stanza. In qualsiasi momento, l'utente può uscire dal sistema nel qual caso viene generato un evento LogoutEvent.

Download ed installazione di nuovi giochi

Quando un client vuole entrare in una certa stanza ma non è in possesso del relativo client, può decidere di scaricarlo dal server in quel momento. Per realizzare questo meccanismo, ogni volta che è necessario installare un nuovo gioco (si veda il metodo installGame), sul nodo client viene istanziato un nuovo oggetto di classe FileClient, che in pratica non è altro che un thread separato che si occupa del download del file specificato, collegandosi al FileServer presente sul nodo server. La trasmissione del file viene fatta usando delle normali socket e degli stream di Java. Quando il download è terminato il FileClient provvederà ad avvertire il MainClient attraverso il metodo completedDownload, in modo che quest'ultimo possa continuare la sua esecuzione.

Interfaccia grafica

L'interfaccia utente dell'applicazione client è composta da una finestra (JFrame) in cui sono presenti un menu, una barra degli strumenti, un pannello centrale ed una barra di stato. Il menu a tendina (JMenuBar) e la barra degli strumenti (JToolbar) danno all'utente la possibilità di compiere operazioni come connessione e disconnesione, impostazione, caricamento e salvataggio di una configurazione, uscita dal programma, ingresso e uscita da una stanza di gioco, visualizzazione informazioni. Nella barra di stato invece compare invece lo stato attuale del client (ON oppure OFF) ed un messaggio relativo alle attività svolte correntemente.

Nel pannello centrale possono essere visualizzate due schermate differenti a seconda dello stato in cui si trova:

  • Quando non si è connessi, o si è connessi ma non si è ancora entrati in una stanza, viene visualizzata la lista dei giochi disponibili, con relative informazioni (nome, versione, autore, dimensione, ecc.). Quando un utente seleziona un gioco accede ad una stanza, sempre ammesso che il client di quel gioco sia installato. In caso contrario comparirà una finestra di dialogo che richiede all'utente se desidera scaricare il client del gioco. Se il giocatore acconsente compare una nuova finestra che visualizza lo stato di avanzamento del download.
  • Quando si è all'interno di una stanza, invece, viene visualizzata un'area di testo (JTextArea) contenente i messaggi della chat, la lista degli utenti presenti nella stanza, e la lista delle partite in attesa (JList). In questa fase l'utente può compiere varie azione, come mandare messaggi (sia pubblici che privati) e creare partite oppure entrare in partite già esistenti. Quando un giocatore entra in una partita viene visualizzata la lista degli utenti presenti in quella partita.

Di seguito si riportano alcune immagini che mostrano l'aspetto dell'interfaccia utente (cliccare sulle immagini per vedere la versione ingrandita).

 

Indietro Inizio pagina Avanti
Indice   Fabio Adani e Marco Chiesi