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

RoomServerAgent

La classe RoomServerAgent riveste, per un RoomServer, lo stesso ruolo nella comunicazione con un altro RoomServer di quello che la classe ClientAgent fa per la comunicazione con RoomClient e MainClient.

Un oggetto della classe RoomServerAgent viene creato dal RoomServer ogni volta che un nuovo RoomServer entra con successo nella rete; in pratica, quindi, nella parte di commit del metodo addServer().

Il costruttore è :

public RoomServerAgent(IRoomServerToServer roomServer, String remoteMainServerName, MainServer mainServer)

quindi alla creazione gli vengono indicati il RoomServer remoto a cui mandare i messaggi, il nome del MainServer remoto e un riferimento al MainServer locale. Questi 2 ultimi parametri sono necessari, per notificare localmente l’eventuale caduta del server remoto a cui si fa riferimento.

Come ClientAgent, anche RoomServerAgent implementa l’interfaccia IEventHandler, ed in particolare il metodo addEvent(). Il RoomServer difatti si limiterà a consegnare l’evento al RoomServerAgent che, con un thread separato, provvederà  a comunicarlo al RoomServer remoto.

La classe che si occupa di questo è

class RoomServerAgentEventHandler extends EventHandler

I dettagli implementativi di questo aspetto sono del tutto analoghi a quelli descritti per la classe ClientAgent.

Vi sono poi metodi che non sono trattati attraverso eventi, ma vengono invocati direttamente dal RoomServer. Essi sono :

public RoomState getRoomState(); per ottenere lo stato della stanza

public IGameClient getGameClient(String user); per ottenere il GameClient per l'utente locale il cui nick è passato come argomento

Compito del RoomServerAgent, come si diceva, è anche quello di rilevare le eventuali cadute di un RoomServer remoto. Se viene rilevata una situazione di questo tipo (analogamente a ciò che fa il ClientAgent, intercettando una RemoteException durante l’invocazione di un metodo remoto), il RoomServerAgent chiama

mainServer.serverDisconnected(remoteMainServerName);

Si fa l’ipotesi che se un RoomServer su un nodo cade, tutti I RoomServer e il MainServer della stessa ‘cellula’ siano caduti. A questo punto sarà il MainServer ad occuparsi della disconnessione del server nella sua complessità (MainServer, RoomServer e clienti connessi), comunicando la scoperta agli altri server della rete.

Non c’è qui problema della sincronizzazione che si aveva nel ClientAgent perché il RoomServerAgent viene utilizzato solo unidirezionalmente, cioè dal RoomServer locale per comunicare con quello remoto e non viceversa. Inoltre la sequenzializzazione delle chiamate è garantita dal RoomServerEventHandler

 

Indietro Inizio pagina Avanti
Indice   Fabio Adani e Marco Chiesi