30
PROGETTO PROGRAMMAZIONE DI SISTEMA Antonio Aversa Giovanni Francesco Corazza

C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Embed Size (px)

DESCRIPTION

Final Presentation of the course System Programming. Politecnico di Torino, 2011.

Citation preview

Page 1: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

PROGETTO PROGRAMMAZIONE DI SISTEMA

Antonio Aversa Giovanni

Francesco Corazza

Page 2: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture
Page 3: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture
Page 4: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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

Page 5: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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

Page 6: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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;

Page 7: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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);

Page 8: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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)

Page 9: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

ClientConnectionHandlerINTERFACCIA 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)

Page 10: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

ClientConnectionHandler

MECCANISMO INTERNO

StartReceiveLoop

InternalStartReceiveLoop

ctor StartSendLoop

InternalStartSendLoop

Configurazione _peerState

BeginSend

BeginReceive

SendMessage

Page 11: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

ClientConnectionHandler

InternalStartReceiveLoop

InternalStartSendLoop

Configurazione _peerState

BeginSendBeginReceive

……_receiveCallback

inSide

_sendCallback_peerState

MessageReceived

outSide

MessageSent

SendMessage

Page 12: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

ServerConnectionHandlerINTERFACCIA 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)

Page 13: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

ServerConnectionHandlerpublic interface IServerConnectionHandler : IConnectionHandler

{

event EventHandler<PeerEventArgs> ClientWaiting;

event EventHandler<PeerEventArgs> ClientAccepting;

event EventHandler<PeerEventArgs> ClientAccepted;

event EventHandler<PeerEventArgs> ClientReleased;

void StartAcceptLoop();

void StartReceiveLoop(EndPoint clientEndPoint);

void StopClient(EndPoint clientEndPoint);

IEnumerable<EndPoint> Clients { get; }

bool SendMessage(object objectToSend, EndPoint clientEndPoint);

}

Page 14: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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.

Page 15: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

ServerConnectionHandler

MECCANISMO INTERNO : ciclo delle callbacks

StartAcceptLoop

InternalStartAcceptLoop

ctor

BeginAccept

……

_acceptCallback

ClientAccepted

InternalStartReceiveLoop

InternalStartSendLoop

Configurazione _peerState

BeginSendBeginReceive

……

_receiveCallback

inSide

_sendCallback_peerState

MessageReceived

outSide

MessageSent

SendMessage

Page 16: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Architettura gerarchicaL'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.

Page 17: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Architettura gerarchica: Messages

Page 18: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Architettura gerarchica : Managers

Page 19: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Architettura gerarchica : Views

Page 20: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Finestra Principale• Interfaccia coerente tra i vari controlli

• Send• Caption

• Attivazione disattivazione controlli• Possibilità di ritornare alla modalità di selezione

Page 21: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Chat• ChatViewer (TableLayoutPanel)

• Scrollbar

• ChatRow• Layout (Colori diversi)• Testo a capo

• ChatMessage

Page 22: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Chat

Page 23: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Clipboard• Control (DatagridView)

• Doppio clic per l'incolla

• ClipboarMonitor• Incapsula

• DescriptionDialog• Formato solo se serializzabile• Scelta demandata all'utente

• ClipboardMessage

Page 24: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Clipboard

Page 25: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Video• Control

• Invio immagini (ServerToolStrip)• Selezione area di schermo (RectForm)• Selezione applicazio (ProcessHandler)• Debug (FragmentDebugForm)

• VideoMessage• Serializzazione

Page 26: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Video

Page 27: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

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…

Page 28: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Punti di forza• Consumo di memoria limitato• Forti ottimizzazioni nell'uso di banda• Architettura a plugin (monitors) -> estendibilità

Page 29: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Consumo di banda ridotto

Page 30: C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture

Footprint in memoria