SlideShare a Scribd company logo
1 of 30
PROGETTO
PROGRAMMAZIONE DI
SISTEMA
            Antonio Aversa Giovanni
            Francesco Corazza
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
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
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;
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);
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)
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)
ClientConnectionHandler
MECCANISMO INTERNO                    SendMessage



    StartReceiveLoop        ctor      StartSendLoop



 InternalStartReceiveLoop          InternalStartSendLoop



      BeginReceive                    Configurazione
                                       _peerState

          …
          …                             BeginSend


                                           …
ClientConnectionHandler                                 InternalStartSendLoop


                                                             Configurazione
InternalStartReceiveLoop            SendMessage               _peerState



     BeginReceive                                             BeginSend


          …                                                       …
   _receiveCallback            _peerState                    _sendCallback


                           inSide           outSide




                       MessageReceived         MessageSent
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)
ServerConnectionHandler
public 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);
  }
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.
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
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.
Architettura gerarchica: Messages
Architettura gerarchica : Managers
Architettura gerarchica : Views
Finestra Principale
• Interfaccia coerente tra i vari controlli
   • Send
   • Caption
• Attivazione disattivazione controlli
• Possibilità di ritornare alla modalità di selezione
Chat
• ChatViewer (TableLayoutPanel)
  • Scrollbar
• ChatRow
  • Layout (Colori diversi)
  • Testo a capo
• ChatMessage
Chat
Clipboard
• Control (DatagridView)
  • Doppio clic per l'incolla
• ClipboarMonitor
  • Incapsula
• DescriptionDialog
  • Formato solo se serializzabile
  • Scelta demandata all'utente
• ClipboardMessage
Clipboard
Video
• Control
  • Invio immagini (ServerToolStrip)
  • Selezione area di schermo (RectForm)
  • Selezione applicazio (ProcessHandler)
  • Debug (FragmentDebugForm)
• VideoMessage
  • Serializzazione
Video
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…
Punti di forza
• Consumo di memoria limitato
• Forti ottimizzazioni nell'uso di banda
• Architettura a plugin (monitors) -> estendibilità
Consumo di banda ridotto
Footprint in memoria

More Related Content

Similar to C# Chat for Windows: Network infrastructure + file sharing + clipboard sharing + screen capture (9)

m-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Netm-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Net
 
Silverlight m v-vm @ DotNetteria
Silverlight m v-vm @ DotNetteriaSilverlight m v-vm @ DotNetteria
Silverlight m v-vm @ DotNetteria
 
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
 
Web Api – The HTTP Way
Web Api – The HTTP WayWeb Api – The HTTP Way
Web Api – The HTTP Way
 
Lezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSLLezione 7: Remote Method Invocation e SSL
Lezione 7: Remote Method Invocation e SSL
 
Java Unit Testing - In container and database testing
Java Unit Testing - In container and database testingJava Unit Testing - In container and database testing
Java Unit Testing - In container and database testing
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
How To React - Aspetti avanzati della gestione dello stato
How To React - Aspetti avanzati della gestione dello statoHow To React - Aspetti avanzati della gestione dello stato
How To React - Aspetti avanzati della gestione dello stato
 
Java lezione 9
Java lezione 9Java lezione 9
Java lezione 9
 

More from Francesco Corazza (6)

Meteor js - TechPeaks Developers Meeting
Meteor js - TechPeaks Developers MeetingMeteor js - TechPeaks Developers Meeting
Meteor js - TechPeaks Developers Meeting
 
Thesis Presentation: Web-Integrated Smart City Infrastructure
Thesis Presentation: Web-Integrated Smart City InfrastructureThesis Presentation: Web-Integrated Smart City Infrastructure
Thesis Presentation: Web-Integrated Smart City Infrastructure
 
TocToc Movement and Crowdsourcing
TocToc Movement and Crowdsourcing TocToc Movement and Crowdsourcing
TocToc Movement and Crowdsourcing
 
Exploit the Integrated Graphics in Packet Processing
Exploit the Integrated  Graphics in Packet ProcessingExploit the Integrated  Graphics in Packet Processing
Exploit the Integrated Graphics in Packet Processing
 
Toc Toc Movement SiCamp Presentation
Toc Toc Movement SiCamp PresentationToc Toc Movement SiCamp Presentation
Toc Toc Movement SiCamp Presentation
 
Toc Toc Introduction
Toc Toc IntroductionToc Toc Introduction
Toc Toc Introduction
 

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

  • 1. PROGETTO PROGRAMMAZIONE DI SISTEMA Antonio Aversa Giovanni Francesco Corazza
  • 2.
  • 3.
  • 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)
  • 10. ClientConnectionHandler MECCANISMO INTERNO SendMessage StartReceiveLoop ctor StartSendLoop InternalStartReceiveLoop InternalStartSendLoop BeginReceive Configurazione _peerState … … BeginSend …
  • 11. ClientConnectionHandler InternalStartSendLoop Configurazione InternalStartReceiveLoop SendMessage _peerState BeginReceive BeginSend … … _receiveCallback _peerState _sendCallback inSide outSide MessageReceived MessageSent
  • 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)
  • 13. ServerConnectionHandler public 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); }
  • 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
  • 21. Chat • ChatViewer (TableLayoutPanel) • Scrollbar • ChatRow • Layout (Colori diversi) • Testo a capo • ChatMessage
  • 22. Chat
  • 23. Clipboard • Control (DatagridView) • Doppio clic per l'incolla • ClipboarMonitor • Incapsula • DescriptionDialog • Formato solo se serializzabile • Scelta demandata all'utente • ClipboardMessage
  • 25. Video • Control • Invio immagini (ServerToolStrip) • Selezione area di schermo (RectForm) • Selezione applicazio (ProcessHandler) • Debug (FragmentDebugForm) • VideoMessage • Serializzazione
  • 26. Video
  • 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à
  • 29. Consumo di banda ridotto