Struttura del server di gioco
Il server principale (MainServer )
per la gestione dei giochi è
l'elemento più importante e complesso presente nel sistema. Esso
infatti deve essere in grado di comunicare prima di tutto con gli utenti
e fornire loro servizi, inoltre deve sincronizzarsi tramite un apposito
protocollo con tutti gli altri server presenti in rete, in modo che
tutti i server mantengano delle informazioni consistenti. All'interno
di ogni server si possono individuare diverse componenti:
- Server principale (
MainServer ). E' l'elemento che gestisce
e coordina tutte le attività del server, sia relativamente alla
interazione con gli altri server che con i client.
- Agente del cliente (
ClientAgent ). Questo elemento software
si occupa di gestire l'interazione tra il server e un generico cliente.
Esiste quindi un agente per ogni utente connesso al server.
- Agente del server (
ServerAgent ). Si occupa di gestire
l'interazione tra ogni server principale e l'altro. Ne esiste uno per
ogni server connesso, e quindi, vista l'architettura, ne esiste uno
per ogni server presente nella rete.
- Server di stanza (
RoomServer ). Si occupa della gestione
delle stanze virtuali (chat) in cui gli utenti possono scambiarsi messaggi.
Ne esiste uno per ogni gioco installato sul server, ovvero ogni gioco
ha la sua stanza dedicata ed il relativo server che la gestisce.
- Agente del server di stanza (
RoomServerAgent ). Analogamente
al caso del ServerAgent , questo si occupa dell'interazione
tra ogni server di stanza e gli altri server di stanza analoghi (relativi
allo stesso gioco) presenti sugli altri nodi.
- Server del gioco (
GameServer ). Si tratta del server
che implementa il gioco vero e proprio, le sue caratteristiche dipendono
quindi dal particolare tipo di gioco che si vuole realizzare.
- Interfaccia grafica (
MainServerUI ). Permette all'amministratore
del server di configurare tutti i parametri di connessione e di controllare
le attività del server. Si prevede anche la possibilità
che il server funzioni senza interfaccia utente, in tal caso tutti
i parametri saranno letti da un file di configurazione.
Dalla panoramica appena fatta si può notare
che esistono due tipi di entità: i server veri e proprio che
sono quelli che gestiscono e memorizzano le informazioni di stato del
sistema, e gli agenti che invece si occupano di gestire le comunicazioni.
Le strutture dati gestite da ogni MainServer
sono:
Struttura |
Contenuto |
localUsers |
Tabella degli utenti locali conessi al server |
remoteUsers |
Tabella degli utenti remoti connessi da altri server |
remoteServers |
Tabella dei server remoti connessi |
roomServers |
Tabella dei server locali per le stanze |
gameInfos |
Tabella con le informazioni sui giochi |
Le strutture dati gestite da ogni RoomServer
sono:
Struttura |
Contenuto |
localUsers |
Tabella degli utenti locali conessi al server di stanza |
remoteUsers |
Tabella degli utenti remoti connessi da altri server di stanza
dello stesso gioco |
remoteServers |
Tabella dei server di stanza remoti connessi relativi allo stesso
gioco |
matches |
Tabella delle partite in definizione |
startedMatches |
Tabella delle partite iniziate |
hostedMatches |
Tabella delle partite iniziate ospitate da questo host |
remoteHostedMatches |
Tabella delle partite iniziate ospitate da un altro host |
A livello di GameServer , invece,
chiaramente le strutture dati memorizzate sul server sono dipendenti
dalla logica del gioco stesso.
Struttura del client
Il client (MainClient ) costituisce
il front-end di tutto il sistema, ovvero è l'applicazione che
viene direttamente utilizzata dagli utenti finali. Dovrà quindi
interagire con l'utente tramite un'interfaccia grafica, ed inoltre comunicare
con uno dei server della rete. In conformità a quanto visto per
i server, anche sui è possibile individuare dei componenti:
- Client principale (
MainClient ). E' l'elemento che gestisce
e coordina le varie attività del client e comunica sia con l'interfaccia
grafica che con il server.
- Interfaccia utente (
MainClientUI ). Si tratta di un
interfaccia grafica a finestre che permette al giocatore di interagire
in modo semplice ed immediato con il resto del sistema.
- Il client di stanza (
RoomClient ). Si occupa della comunicazione
con il corrispondente server di stanza presente sul server ed è
usato per l'invio e la ricezione di messaggi tra i vari utenti.
- Il client del gioco (
GameClient ). E' il modulo che
implementa il gioco vero e proprio, e interagirà con il relativo
server del gioco. L'interazione chiaramente dipende da com'è
implementato il gioco. Nel caso di architettura peer-to-peer, questo
componente comunicherà direttamente con un altro client analogo
di un altro utente.
- L'interfaccia utente del gioco (
GameClientUI ). E' il
front-end che permette all'utente di giocare. Ovviamente ogni gioco
avrà la sua interfaccia utente.
Struttura del server di autenticazione degli
utenti
Questo server (UserDBServer ), che
è unico in tutta la rete, viene contattatto dai server di gioco
ogni volta che un utente tenta di accedere al sistema, e verifica se
tale utente è abilitato oppure no all'ingresso nel sistema, controllando
nome utente e password. Chiaramente questo server dovrà interagire
con una base di dati contenente informazioni sugli utenti, tale base
di dati potrà essere un vero e proprio DBMS oppure più
semplicemente un file. In questa sede non ci si preoccuperà di
come sarà poi realizzata la base dati, ma si assume soltanto
che funzioni correttamente, l'implementazione potrà poi essere
variata a seconda delle necessità. In pratica l'unica funzionalità
che il server di autenticazione deve fornire è un metodo checkUser
che ha come argomenti il nome e la password e che restituisce un valore
booleano.
Metodo |
Azione corrispondente |
checkUser |
Verifica se un utente può accedere al sistema |
La
struttura adottata per il server (riportata in figura) mette in evidenza
la presenza di due componenti:
- Il server di autenticazione vero e proprio (
UserDBServer )
che si occupa di gestire le richieste da parte dei MainServer interrogando
la base di dati.
- L'interfaccia utente (
UserDBServerUI ) che permette
all'amministratore del sistema di gestire gli account degli utenti.
Riguardo alla sicurezza del sistema, non viene
al momento previsto nessun accorgimento, questo significa che le password
saranno trasmesse in chiaro e non criptate. D'altra parte la sicurezza
non era tra i prerequisiti del sistema, visto che si tratta di un applicazione
videoludica in cui non vengono trattate delle informazioni critiche.
Interazione Client-Server
Ogni client comunica con il sistema mediante
il server a cui è connesso, ed in particolare comunica principalmente
con il suo agente presso il server, il quale si occupa di gestire tutta
l'interazione. Fanno eccezione a questo l'ingresso e l'uscita dal sistema,
per le quali la comunicazione avviene direttamente con il MainServer .
Si riporta di seguito l'interfaccia di comunicazione fornita dal MainServer .
Metodo |
Azione corrispondente |
login |
Ingresso di un utente nel sistema |
logout |
Uscita di un utente dal sistema |
E quella fornita dal ClientAgent
Metodo |
Azione corrispondente |
getGameInfo |
Restituzione informazioni sui giochi installati e disponibili sul
server |
getFileServer |
Restituzione l'indirizzo del server per il download dei giochi |
joinGameRoom |
Ingresso di un utente in una stanza |
leaveGameRoom |
Uscita di un utente da una stanza |
getUsers |
Restituzione della lista di utenti presente in una stanza |
getMatches |
Restituzione della lista di partite in attesa in una stanza |
getStartedMatches |
Restituzione della lista di partite in corso in una stanza |
getUsersInMatch |
Restituzione della lista di giocatori presenti in una partita |
sendMsg |
Invio di un messaggio pubblico nella stanza |
sendPrivateMsg |
Invio di un messaggio privato ad un altro utente |
createMatch |
Creazione di una nuova partita |
enterMatch |
Ingresso in una partita |
exitMatch |
Uscita da una partita |
startMatch |
Avvio di una partita |
L’utilità del componente ClientAgent
è molteplice :
- Mantenere a livello di server informazioni proprie del client, come
per esempio il nickname e la stanza in cui si trova l'utente, di modo
che tali informazioni non debbano essere inviate per ogni chiamata
remota, alleggerendo in questo modo la comunicazione.
- L’implementazione ad eventi delle chiamate
del server sul client consente di ottenere una maggiore concorrenza
da parte del server e per questo diminuire i tempi di attesa degli
utenti.
- Fare da filtro alle chiamate del client, eventualmente segnalando
l’impossibilità di una operazione senza consultare il RoomServer (limitandone
quindi il congestionamento), ma semplicemente in base ad informazioni
mantenute localmente sullo stato del cliente.
- Identificare eventuali malfunzionamenti del client e mettere in
atto le procedure di disconnessione.
Per quanto riguarda invece la comunicazione dal
server verso il client, la maggior parte dell'interazione viene gestita
dal componente RoomClient . L'unica eccezione si ha quando
un server va offline, nel qual caso lo comunica direttamente al MainClient .
Ecco l'interfaccia di MainClient .
Metodo |
Azione corrispondente |
serverOff |
Disattivazione del server |
E di RoomClient
Metodo |
Azione corrispondente |
getGameClient |
Restituzione di un riferimento al client del gioco (è invocato
prima dell'inizio di una partita) |
receiveMsg |
Ricezione di un messaggio pubblico |
receivePrivateMsg |
Ricezione di un messaggio privato |
joinedGameRoom |
Ingresso di un utente dalla stanza |
leftGameRoom |
Uscita di un utente dalla stanza |
createdMatch |
Creazione di una partita da parte di un giocatore |
enteredMatch |
Ingresso di un giocatore in una partita |
exitedMatch |
Uscita di un giocatore da una partita |
deletedMatch |
Eliminazione di una partita (si verifica quando non rimane più
nessun giocatore iscritto alla partita) |
startedMatch |
Avvio di una partita |
finishedMatch |
Terminazione di una partita |
callFinishMatch |
Comunicazione al client di terminare la partita in corso |
Interazione Server-Server
L'interazione tra un server di gioco e l'altro, prevede una serie
di funzionalità che ogni server deve mettere a disposizione della
rete, le quali ne identificano l'interfaccia di comunicazione. Per quanto
riguarda il MainServer queste funzionalità sono
riassunte nella seguente tabella:
Metodo |
Azione corrispondente |
addServer |
Ingresso di un nuovo server nella rete |
removeServer |
Uscita di un server dalla rete |
remoteLogin |
Ingresso di un utente su un server remoto |
remoteLogout |
Uscita di un utente connesso ad un server remoto |
getAddress |
Restituisce l'indirizzo del server |
getGameList |
Restituisce la lista dei giochi installati sul server |
A livello di RoomServer invece si hanno i seguenti metodi:
Metodo |
Azione corrispondente |
addServer |
Ingresso di un nuovo server nella rete |
removeServer |
Uscita di un server dalla rete |
getRoomState |
Restituisce lo stato della stanza (utenti connessi, partite, ecc.) |
getGameClient |
Restituisce un riferimento ad un particolare client remoto dato
il suo nick |
remoteJoinGameRoom |
Indica che un utente remoto è entrato nella stanza |
remoteLeaveGameRoom |
Indica che un utente remoto è uscito dalla stanza |
remoteSendMsg |
Indica l'invio di un messaggio pubblico da parte di un utente remoto |
remoteSendPrivateMsg |
Indica l'invio di un messaggio privato da parte di un utente remoto |
remoteCreateMatch |
Indica la creazione di una nuova partita da parte di un utente
remoto |
remoteEnterMatch |
Indica l'ingresso in una partita da parte di un utente remoto |
remoteExitMatch |
Indica l'uscita da una partita da parte di un utente remoto |
remoteStartMatch |
Indica l'avvio di una partita da parte di un utente remoto |
remoteFinishMatch |
Indica la terminazione di una partita ospitata su un server remoto |
Molte delle operazioni ora elencate comportano dei particolari problemi
di sincronizzazione che saranno discussi in seguito.
Come nel caso del ClientAgent , anche
il ServerAgent ed il RoomServerAgent hanno
il compito di memorizzare delle informazioni proprie del server a cui
fanno riferimento in modo da ottimizzare le prestazioni del sistema.
|