Tesina Applicazioni Telematiche
Quiz Multi-utente web-based
Studenti:
Pasquale Di Rienzo
Bartolomeo Ovilio
Roberto Pascale
Analisi dei requisiti
Obiettivo principale di questo progetto è lo sviluppo di
un’applicativo (sia client che server) che realizzi un quiz
multiutente. Oltre alla funzione di base si vuole offrire anche
la possibilità di scambiare flussi multimediali in tempo reale
(audio/video, testo).
Non meno importante la possibilità di usufruire lato client
dell’applicativo su una qualsiasi piattaforma e senza necessità di
dover installare alcun programma.
Casi d’uso
Lato client:
Il client deve poter innanzitutto avere la possibilità di registrare un
proprio account di gioco presso il server ed effettuare la procedura di
login. Inoltre deve poter scegliere un proprio avatar che lo
rappresenterà all’interno del gioco (immagine o video dalla web-cam) e
deve poter decidere se condividere la propria voce. Una volta
autenticato, l’utente dovrà avere la possibilità di scegliere fra più
stanze di gioco, e avere la possibilità di scambiare messaggi testuali.
Lato server:
L’amministratore del gioco dovrà avere la possibilità di configurare a
suo piacimento alcune impostazioni di gioco: stanze, scelta numero di
rounds, scelta numero di concorrenti per stanza.
Inoltre deve avere la possibilità di gestire le impostazioni relative al
database contenente le domande: aggiunta/rimozione domande, scelta
tra almeno due diversi DBMS.
Casi d’uso: schermata iniziale gioco
Casi d’uso: dopo il login
Casi d’uso: amministratore
Tecnologie utilizzate(1/2)
• Adobe Flash
• Openfire
• Red5 Flash Server
Protocolli in gioco
• HTTP
• XMPP
• RTMP
Tecnologie utilizzate(2/2)
Per quanto riguarda il formato di scambio dei messaggi (sia per la chat,
sia per il gioco) è stato scelto il protocollo XMPP, per via della sua
facile estendibilità e della sua diffusione grazie alla quale è facile
reperire tecnologie a suo supporto.
Avendo fissato la scelta del protocollo, si è deciso di utilizzare
Openfire per sviluppare l’applicativo lato server, che quindi ha assunto
la forma di un plugin.
Per la realizzazione della parte client dell’applicativo la scelta è
ricaduta sulla tecnologia Flash di Adobe, largamente diffusa e ormai
supportata da qualsiasi browser, eliminando la necessità di
installazione del programma da parte degli utenti.
Adobe ci ha anche fornito i mezzi per lo streaming audio/video
mediante il protocollo RTMP, divenuto ormai uno standard de facto.
Come server di streaming abbiamo optato per il server Red5, presente
sotto forma di plugin per il server Openfire (non è stato quindi
necessario installare due server diversi sulla stessa macchina).
Messaggi scambiati
Come accennato è stato necessario estendere XMPP per introdurre messaggi
ad hoc per la logica del gioco. Si è agito su due fronti: da una parte si sono usati
i messaggi IQ per l’interazione con il server di gioco, dall’altra si è deciso di
estendere anche i messaggi di presenza introducendovi informazioni di stato
prettamente relative al gioco.
Le estensioni definite sono tre:
• Game: per i pacchetti IQ, relativi ai messaggi scambiati durante il gioco (invio
domanda da parte del server, relativa risposta da parte del client, e richiesta
di partecipare a una partita)
• GameInfo: per i pacchetti IQ, contenenti informazioni sul numero di stanze e
sul numero di giocatori ivi presenti.
• GamePresence: per i pacchetti Presence, usati dai giocatori per scambiarsi
informazioni di stato: scelta dell’avatar utilizzato, stato di gioco (ready /not
ready).
Esempio:GamePresence
Progettazione server-side
XMPP
GameInfo
Handler
Game
Database
Game
Handler
GameMaster
Flash Client
Ruoli dei componenti server-side
GameHandler:
Questo componente si occupa di intercettare i pacchetti XMPP inviati dai client relativi al
gioco. Al suo interno conserva riferimenti a oggetti di tipo GameMaster, svolgendo la
funzione di “dispatcher”: ogni volta che riceve dei msg dai client, per una determinata stanza
di gioco, si occuperà di inoltrarli al GameMaster responsabile. Inoltre inizializza la
connessione al Database attraverso il componente GameData.
GameMaster:
Rappresenta il gestore della stanza di gioco. Esso viene eseguito come Thread, in modo che
più GameMaster (e quindi più stanze di gioco) possono essere attivi contemporaneamente .
Racchiude i metodi di gestione della logica del gioco, effettuando interazioni con il
componente GameDatabase al fine di ottenere le domande da presentare ai client.
GameDatabase:
E’ il componente che rappresenta il wrapper del database utilizzato per immagazzinare le
domande relative al quiz. Mette a disposizione dunque i metodi di
connessione/disconnessione al database, e metodi per effettuare interrogazioni su di esso.
GameInfoHandler:
Questo componente si occupa di intercettare i messaggi inviati dai client relativi alle
richieste di informazioni sul gioco. Tali richieste rappresentano la volontà dei client di
sottoscriversi a ricevere aggiornamenti sullo stato delle stanze di gioco (il numero di
partecipanti per stanza).
Init:
Questa classe rappresenta il Plugin del gioco . Presenta il metodo “initializePlugin” che viene
invocato all’avvio del server. Essa ha il compito di istanziare tutti gli altri componenti.
Altri componenti
Player:
E’ la struttura dati utilizzata per mantenere le informazioni relative ai giocatori (id,
username).
Domanda:
E’ la struttura dati utilizzata per mantenere informazioni relative alle domande del quiz.
Result:
E’ la struttura dati utilizzata per mantenere informazioni relative ai messaggi di risposta alle
domande del quiz (numero di risposta, tempo impiegato ecc.)
Console Amministratore
L’aggiunta/rimozione delle stanze è una caratteristica già presente in Openfire, quindi non c’è
stato bisogno di implementarla. L’unico accorgimento è quello di creare un servizio apposito
chiamato “game”, in modo da separare le normali stanze di chat da quelle adibite al gioco.
Per quanto riguarda la configurazione dei parametri (di gioco e del database) si è utilizzata la
tecnologia delle JSP per aggiungere sezioni di setting alla console dell’amministratore. Ogni
parametro è rappresentato attraverso le variabili d’ambiente di Openfire chiamate JiveGlobals.
Grazie ad esse è possibile modificare alcuni aspetti senza dover ricompilare i sorgenti.
Progettazione client side
Il lato client è stato scritto in ActionScript, in particolare si sono rivelate utili le
API XIFF per quanto riguarda la comunicazione XMPP con il server di gioco.
Il client stabilisce due connessioni persistenti con il server:
•Una connessione XMPP sulla quale vengono scambiati i messaggi di gioco.
•Una connessione RTMP sulla quale avviene lo scambio di flussi multimediali.
In alcuni scenari (download swf, registrazione ecc.) viene stabilita anche una
connessione HTTP .
HTTP
XMPP(Xiff)
RTMP
Scenari di interazione
Scenario “Registrazione account”
L’utente preme il
tasto Registra
Quando l'utente edita il campo Username, viene inviata una richiesta Http asincrona al
server Openfire. Tale richiesta attiva una servlet che controlla se lo username è già stato
registrato in precedenza o meno, restituendo l’esito al client.
Scenari di interazione
Scenario “Login”
Scenario considerato : I server accettano con successo le richieste di connessione
Scenari di interazione
Scenario “Utente vuole partecipare al gioco”
In caso di risposta affermativa l’utente invierà un messaggio di presence alla stanza in cui
comunicherà il suo nuovo stato di ready a tutti gli altri partecipanti.
Se l’utente decide di non voler più partecipare invia un messaggio di tipo “Cancel” (cliccando
sull’apposito tasto).
Scenari di interazione
Scenario “Utente risponde a una domanda”
L’utente preme un
tasto risposta
Alla fine dei round, il server invierà un ulteriore messaggio contenente il vincitore finale (ovvero
il giocatore che ha totalizzato il maggior numero di risposte esatte).
Scarica

Tesina Applicazioni Telematiche