4. Gestione della connessione: indice
Descrizione top-down dell’architettura:
• La gestione di base della connessione: l’interfaccia
IConnectionHandler e relativa implementazione
• Il comportamento del server e dei clients: l’interfaccia
IServerConnectionHandler e IClientConnectionHandler (e
relative implementazioni)
• Lo stato locale e di un peer connesso ad un endpoint remoto:
l’interfaccia IPeerState
• Il singolo lato di comunicazione di un PeerState: ISidePeerState
• Il lato di comunicazione in uscita: IOutSidePeerState
• Il lato di comunicazione in ingresso: IInSidePeerState
5. Gestione della connessione
• Affidata al componente ConnectionHandler
• che la realizza con l’uso delle Socket (chi implementa l’interfaccia
potrebbe gestire la connessione in molti modi differenti, diversi
dall’uso delle Socket)
• Le modalità di gestione cambiano fra client e server
• Il ConnectionHandler è solo una classe astratta…
• …a partire dalla quale sono state implementate le sue due effettive
concretizzazioni:
• ServerConnectionHandler
• ClientConnectionHandler
6. ConnectionHandler
• Il ConnectionHandler è una classe astratta che implementa
l’interfaccia di base di una connessione (IConnectionHandler): in
quanto tale espone:
• i parametri di connessione (e NON di autenticazione), ricevuti al
ctor
• ConnectionHandlerParameters ConnectionParameters { get; }
• I metodi e gli eventi attraverso cui gestire il ciclo di vita del
componente (avvio e terminazione)
• bool Start();
• event EventHandler<PeerEventArgs> Starting;
• event EventHandler<PeerSocketEventArgs> Started;
• event EventHandler<PeerEventArgs> Terminated;
7. ConnectionHandler
• gli eventi di connessione (comuni a client e server).
• event EventHandler<PeerMessageEventArgs> MessageEnqueuing;
• event EventHandler<PeerMessageEventArgs> MessageSending;
• event EventHandler<PeerMessageEventArgs> MessageSent;
• event EventHandler<PeerMessageEventArgs> MessageWaiting;
• event EventHandler<PeerMessageEventArgs> MessageReceiving;
• event EventHandler<PeerMessageEventArgs> MessageReceived;
• la coda dei messaggi in uscita
• IEnumerable<Pair<EndPoint, object>> MessageQueue { get; }
• l’invio dei messaggi (asincrono e thread-safe)
• bool SendMessage(object objectToSend);
8. ConnectionHandler
• Il ConnectionHandler non può conoscere i dettagli relativi alle
modalità con le quali verrà gestita la connessione:
• sono diverse fra client e server →
• i seguenti metodi sono astratti:
• public abstract bool Start();
• public abstract bool SendMessage(object objectToSend);
• public abstract IEnumerable<Pair<EndPoint, object>> MessageQueue { get;
}
• Saranno effettivamente implementati nel ServerConnectionHandler e
nel ClientConnectionHandler
• … il ConnectionHandler di per sé fa ben poco: è però una
classe significativa a livello di analisi e utile a livello di design
(fattorizza il codice delle funzioni protected virtual void che
invocano gli eventi in maniera thread-safe, implementa la
struttura del pattern Dispose e la property dei parametri di
connessione)
9. ClientConnectionHandler
INTERFACCIA PUBBLICA
• Ctor: si limita a ricevere i parametri di connessione e ad
invocare il costruttore della classe base
• Start: lancia l’evento Starting (interrompibile → Start bloccata,
ma oggetto riusabile – è possibile reinvocare la Start), crea e
configura la socket, lancia l’evento Started (interrompibile →
Start bloccata ed oggetto in Dispose – graceful degradation
mode), avvia il loop di ricezione
• SendMessage: accoda il messaggio alla MessageQueue (un
client non deve comportarsi da Relay) – asincrono
• MessageQueue: coda dei soli messaggi da inviare al server
• StartReceiveLoop: permette di riavviare il loop (se bloccato
attraverso il Block del MessageWaiting). E’ l’unico metodo
dell’interfaccia specifica del client (IClientConnectionHandler)
12. ServerConnectionHandler
INTERFACCIA PUBBLICA
• Ctor: si limita a ricevere i parametri di connessione e ad
invocare il costruttore della classe base
• Start: lancia l’evento Starting (interrompibile → Start bloccata,
ma oggetto riusabile – è possibile reinvocare la Start), crea e
configura la socket di listen, lancia l’evento Started
(interrompibile → Start bloccata ed oggetto in Dispose –
graceful degradation mode), avvia il loop di accept
• SendMessage: accoda il messaggio alla MessageQueue. NB:
il server deve comportarsi da Relay – enqueuing asincrono
• MessageQueue: coda dei messaggi da inviare ad ogni client
• StartAcceptLoop: permette di riavviare il loop (se bloccato
attraverso il Block del ClientWaiting). E’ uno dei metodi
dell’interfaccia specifica del server (IServerConnectionHandler)
14. ServerConnectionHandler
• Eventi aggiuntivi: relativi alla gestione dei client (Waiting,
Accepting, Accepted, Released)
• StartReceiveLoop(client): permette di riavviare il loop
(se bloccato attraverso il Block del MessageReceiving
sullo specifico client). E’ uno dei metodi dell’interfaccia
specifica del server (IServerConnectionHandler)
• StopClient(client): interrompe la gestione di un client.
Viene chiusa la relativa Socket di comunicazione.
• SendMessage(object, client): invia un messaggio ad
uno specifico client.
15. ServerConnectionHandler
MECCANISMO INTERNO : ciclo delle callbacks
StartAcceptLoop ctor
InternalStartSendL
oop
InternalStartAcceptLoop
Configurazio
InternalStartReceive
SendMessage ne _peerState
Loop
BeginAccept
BeginReceiv BeginSend
… e
…
… …
_acceptCallback _receiveCallba _sendCallback
ck _peerStat
e
inSid outSi
e de
ClientAccepted MessageReceive MessageSent
d
16. Architettura gerarchica
L'architettura scelta è una semplificazione dell'MVC: il controller è
spezzato. Il Manager rappresenta il Model che però interagisce con i layer
più bassi di comunicazione, mentre il Control rappresenta la View
incaricata, però, di dell'interazione con l'utente.
• Messaggi
• Rappresentano una parte fondamentale della comunicazione, i controlli
sono in grado di visualizzare solo questo tipo di dato trasmesso (in
particolare il loro specifico dato).
• Manager
• Mantiene una lista degli ultimi messaggi inviati, è incaricato dell'inoltro
verso il layer sottostante del messaggio proveniente dalla view.
• Controlli
• Visualizzano un particolare tipo di messaggio e si preccupano
dell'interazione con l'utente, quindi il comportamento è molto
eterogeneo.
20. Finestra Principale
• Interfaccia coerente tra i vari controlli
• Send
• Caption
• Attivazione disattivazione controlli
• Possibilità di ritornare alla modalità di selezione
27. Punti di debolezza
• ... cioè miglioramenti se ci fosse stato più tempo
• Lentezza nell'aggiornamento dei client
• Interfaccia utente migliorabile
• File non trasferibili tramite clipboard
• Assenza di un reale MVC
•…
• Questa presentazione…
28. Punti di forza
• Consumo di memoria limitato
• Forti ottimizzazioni nell'uso di banda
• Architettura a plugin (monitors) -> estendibilità