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

UserDBServer

Per l'implementazione del server che mantiene le informazioni sugli utenti ci si è appoggiati al DBMS InstantDB.

Si tratta di un DBMS sviluppato da terzi completamente in Java, che ben si adatta alle esigenze di questo progetto. A dire la verità, vista l'esigua complessità del database utilizzato, che di fatto si riduce ad un'unica tabella con due campi, sarebbe stato possibile implementare questo componente dell'architettura NetGame come una semplice applicazione che gestisca un file di testo.
La scelta di utilizzare un database relazionale ci ha però offerto l'opportunità di approfondire un altro aspetto della piattaforma Java, ovvero l'API JDBC. Questa API consente infatti a programmi scritti in Java di accedere ai database praticamente di qualunque costruttore, grazie alla possibilità di utilizzare il bridge JDBC-ODBC. ODBC è uno standard per comunicare con database introdotto da Microsoft e supportato da svariati produttori (tra cui Oracle, Infomix, Synbase). Essa consiste in un'API generale per tutti i database. Ogni database fornisce poi la propria implementazione del driver ODBC adatta al proprio server DB. Essa converte le istruzioni dal linguaggio standard SQL a quello specifico del DB in questione.
Anche Java fornisce un'API analoga a ODBC, tuttavia i driver JDBC non comunicano direttamente con tanti server quanti quelli a cui si connettono i driver ODBC. Per questo uno dei primi driver JDBC realizzato fu proprio il bridge JDBC-ODBC, grazie al quale java può accedere con semplicità a tutti i DB che supportano ODBC.
In realtà in questo progetto non si è avuta necessità di utilizzare tale bridge in quanto InstantDB fornisce direttamente un driver compatibile JDBC, e quindi può essere utilizzato direttamente questo.

La connessione ad un database utilizzando questa API prevede innanzitutto l'inserimento della direttiva

import java.sql.*;

in quanto tutte le classi interessate sono contenute in questo package. Sarà poi necessario caricare il driver JDBC del database. Questo lo si fa con la seguente istruzione :

Class.forName(nome della classe driver);

Nel caso IstantDB, la classe che implementa il driver è : org.enhydra.instantdb.jdbc.idbDriver.
Dopodiché la connessione si può instaurare con:

DriverManager.getConnection(Url del DB);

le url utilizzate per stabilire una connessione con un database variano secondo il driver JDBC in uso. La forma generale è comunque la seguente : jdbc:subprotocol:subname. Nel caso di IstantDB la forma è :

jdbc:idb:<percorso del file di proprietà del database>

Il file di proprietà è il file (in genere con estensione .prp) che definisce tutte le impostazioni del database. Si rimanda alla documentazione di IstantDB per una descrizione dettagliata delle numerose opzioni; qui basti ricordare che è in tale file che viene definito il file (o i files) che conterranno le tabelle costituenti il database.

Una volta creata la connessione i comandi SQL, query e update, possono essere eseguiti attraverso la classe statement ed i metodi executeQuery() e executeUpdate().

Struttura del DB e query utilizzate.

La struttura del database di NetGame è semplicissima e consiste in un'unica tabella (Users) composta da due campi, che rappresentano rispettivamente lo username e la password degli utenti iscritti a NetGame. L'istruzione SQL per creare la tabella è la seguente :

CREATE TABLE Users (userName char(20), password char(20))

La chiave primaria è evidentemente lo userName, perché non è consentito in NetGame che più utenti abbiano lo stesso nome.
Le query necessarie in questo progetto sono le seguenti :

Verifica se un utente è iscritto e con quale password :

SELECT * FROM Users WHERE userName = 'nome'

Aggiunta di un nuovo account :

INSERT INTO Users VALUES ('nome', 'pwd')

Rimozione di un account :

DELETE FROM Users WHERE userName = 'nome'

Metodi della classe

All'avvio (nella funzione main) è possibile specificare un particolare file di configurazione, altrimenti ne viene assunto uno a default (netgameUsers.prp). E' altresì possibile specificare host, nome e porta del server stesso. Lo UserDbServer si dovrà poi configurare come classe remota, e quindi effettuare tutte le operazioni necessarie (impostazione di un security manager e binding all'RMIRegistry).
A questo punto può essere aperta la connessione al server. Tale connessione sarà poi chiusa al termine dell'esecuzione.
Lo UserDBServer deve soddisfare due esigenze :

  • implementare l'interfaccia IUserDBAccess, per poter essere consultata dai MainServer
  • fornire i metodi per apportare le modifiche al database, ovvero per inserire ed eliminare account di utenti

L'interfaccia IUserDBAccess presenta un solo metodo :

public void checkUser(String userName, String password) throws RemoteException, FailedLoginException;

questo metodo controlla se esiste l'account userName e la password corrispondente è esatta. Solo in caso negativo viene lanciata l'eccezione FailedLoginException.

I metodi per modificare il database sono :

public boolean insertAccount(String userName, String password)
public boolean removeAccount(String userName)

con l'ovvio significato. Naturalmente si controllerà rispettivamente nel primo caso che l'account non esista già e nel secondo che esista effettivamente prima di toglierlo. Questi metodi sono invocabili solo attraverso l'interfaccia grafica, che ha l’aspetto seguente:

Indietro Inizio pagina Avanti
Indice   Fabio Adani e Marco Chiesi