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

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.

Indietro Inizio pagina Avanti
Indice   Fabio Adani e Marco Chiesi