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