| Index | Next | Prev. |
4.Architettura client-server per applicazioni di didattica distribuita 

4.1 Definizioni dell’obiettivo del caso di studio

L’oggetto ed obiettivo principale di questa tesi consiste nel progetto e nella realizzazione di una architettura client-server, sviluppata in modo da risultare il più possibile d’uso generale, che possa essere usata come piattaforma per sviluppare applicazioni di tipo distribuito per la didattica.

L’uso del linguaggio Java, le cui caratteristiche sono state oramai ampiamente discusse, consente di immaginare, la realizzazione di applicazioni immerse nel contesto delle tecnologie WWW, con tutti i vantaggi in termini di ampiezze e diffusione del mercato potenziale e dell’ottimo rapporto costo/prestazione.

In particolare, nell’ambito di questa tesi si è individuata una vasta classe di applicazioni dedicate alla didattica nelle quali è necessario disporre di un generico "controllore di oggetti" (il server) che dialoga con una interfaccia utente localizzata in maniera imprecisata sulla rete e che richiede servizi per guidare gli studenti/utilizzatori in un opportuno percorso lavorativo.

In pratica, l’idea è quella di progettare e poi implementare in linguaggio Java una applicazione client-server per il controllo remoto di dispositivi elettronici e rendere operativa questa architettura attraverso il World Wide Web. Nel nostro caso di studio, per esempio, il dispositivo elettronico da controllare è una classe di strumenti di misura con la quale un generico utente interagisce per effettuare delle esperienze di laboratorio. Altre astrazioni di ampia utilità potrebbero comprendere il caso in cui elettronico è una qualche forma di digital library con lezioni in aula preregistrate: lo studente attraverso il Web può ottenere il controllo della digital library per richiedere la lezione di suo interesse. Ancora meglio si può immaginare direttamente una video camera situata in un’aula e connessa ad una dispositivo di acquisizione dati a sua volta connesso a un personal computer in rete con Internet.

Lo studente può allora ottenere, attraverso il Web, il controllo della scheda di acquisizione dati per ricevere il segnale video a casa propria, anche se attualmente la banda passante e i protocolli di Internet non garantiscono una corretta fruibilità di questo tipo di applicazioni.

Attraverso una rappresentazione grafica si chiarisce ciò che si vuole fare:

Si consideri Internet ed in particolare ciò che in Internet e il World Wide Web (Figura 4.1):

 

Figura 4.1 Il client-server nel contesto World Wide Web

 

In figura si ha un client Web connesso ad un server Web mediante Internet e, un altro oggetto chiamato Dispositivo Controllabile. Quest’ultimo rappresenta un qualunque dispositivo, apparecchiatura o generico oggetto che possiamo controllare mediante interfacciamento con un computer.

Naturalmente, l’opportunità di utilizzare le tecnologie WWW sta nel fatto che oggigiorno il Web è in continua crescita e i client Web (o browser) sono sempre più diffusi. Quindi costruire qualcosa basandosi sul World Wide Web equivale a renderla immediatamente disponibile a migliaia di utenti che già usano il Web e i browser Web.

Dalla situazione illustrata in Figura 4.1 ci si porta in quella illustrata nella Figura 4.2.

 

Figura 4.2 Dispositivo Controllabile nel contesto World Wide Web.

 

Nella Figura 4.2 Dispositivo Controllabile è connesso al server Web e sul client Web vi è l’Interfaccia Utente Dispositivo: un applicativo con cui l’utente può interagire per inviare controlli al dispositivo. Non è importante che il dispositivo da controllare sia fisicamente connesso al server Web, il server Web funzionerà solo da "contenitore" per le applicazioni client-server che servono per il controllo del dispositivo. Il dispositivo deve essere semplicemente connesso a un computer, a sua volta connesso a Internet.

Si vuole che le applicazioni necessarie per il controllo del Dispositivo Controllabile siano alquanto generali, in particolare il più possibile indipendenti dalle caratteristiche del dispositivo fisico.

In generale, come in ogni problematica client-server si distinguono due categorie di applicazioni (Figura 4.3): una applicazione che funziona da client (di cui una piccola parte è rappresentata da Interfaccia Utente Dispositivo), il cui compito è che da una parte di accettare comandi dall’utente e dall’altra dialogare con il server, e una applicazione che funziona da server che da una parte dialoga con il client e dall’altra, in questo caso, con il dispositivo da controllare.

 

Figura 4.3 Architettura client-server per il controllo di Dispositivo Controllabile.

 

Nei paragrafi successivi viene effettuata una breve discussione delle problematiche che occorre affrontare nel contesto del progetto di una applicazione client-server.

Si passa poi all’applicazione di queste motodologie allo specifico caso di studio oggetto di questa tesi, utilizzando il linguaggio Java come linguaggio di codifica.

  4.2 Progettazione di applicazioni client-server

    I sistemi client-server nascono come coordinamento di due sistemi logici (il client e il server) e dei componenti delle rispettive applicazioni.

    La progettazione di applicazioni client-server richiede la scelta di architetture appropriate: poiché le diverse parti di un’applicazione vengono eseguite in più di un sistema, il software client-server deve essere modularizzato per consentire la distribuzione tra macchine client e macchine server. La separazione delle funzionalità delle applicazioni in vari componenti facilita l’elaborazione di applicazioni client-server, in quanto i componenti forniscono ubicazioni ben definite in cui le applicazioni possono essere distribuite.

    La logica delle applicazioni deve essere separata in componenti indipendenti, dove un componente di richiesta (o client) effettua le richieste e si attende che un componente di risposta (o server) gli restituisca i risultati.

Divisione del lavoro tra client e server
Partendo da una definizione client-server come interazione tra componenti applicativi sparsi, si nota che la posizione di esecuzione di questi componenti diventa importante per le prestazione dell’applicazione e del sistema. Alcuni componenti delle applicazioni possono essere eseguiti in maniera più efficiente nel server oppure nel client.

In generale nelle applicazioni client-server si può fare una suddivisione, a priori, dei componenti che vanno posizionati nel client e di quelli che vanno nel server:

 Compiti del client sono:

  • Visualizzazione / Presentazione
  • Interazione con l’utente
  • Formulazione di richieste
  • Logica dell’applicazione
Compiti del server sono:
  • Query sulla risorsa (nel caso specifico sul dispositivo controllabile)
  • Eventuali calcoli
  • Gestione dei dati
  • Comunicazioni
  • Elaborazione di risposte
Una delle chiavi di volta per realizzare applicazioni client-server ben riuscite è la distribuzione corretta delle funzionalità e dei programmi tra le macchine client e le macchine server, una corretta distribuzione del codice produce l’esecuzione ottimale sia per il client sia per il server: se una delle due macchine risulta sovraccaricata l’altra è potenzialmente sottoutilizzata. In particolare il sovraccarico della macchina server è rischioso perché molti client sono portati a rallentare.

E’ importante notare che la capacità di elaborazione del server è fissa, la condivisione di questa capacità tra più client può degradare le prestazioni o addirittura saturare il server, una corretta distribuzione delle funzionalità diventa importante affinché il server conservi la capacità di elaborazione.

La programmazione client-server
Le applicazioni client-server devono essere progettate nell’ottica della modularità, in quanto parti del programma applicativo devono essere eseguite in più di una macchina. Questi componenti modulari, combinati in rete, aumentano sensibilmente le capacità e le prestazioni del software applicativo.

La codifica per le applicazioni client-server richiede l’attuazione di alcuni buoni principi di programmazione, inoltre sviluppare applicazioni client-server vuol dire rispondere ai seguenti requisiti:

  • Utilizzo di una codifica non monolitica: le varie parti di una applicazione vanno strutturate in componenti modulari invece che in un unico blocco monolitico, ciò vuol dire dedicare molto più tempo all’architettura di un’applicazione prima che abbia inizio la codifica.
  • Codifica in un’architettura di servizi indipendenti: ciascun componente dell’applicazione deve essere considerato come un servizio modulare, questi elementi di servizio modulare consentono di raggruppare logiche simili. La separazione dei vari componenti logici delle applicazioni delinea in modo quasi automatico il codice appartenente al componente server e quello appartenente al componente client. Possibilmente l’interfaccia tra i componenti deve rimanere inalterata anche se i componenti vengono situati su un’altra macchina o un’altra rete.
  • Gestione dei dati specifica per ogni client: poiché i server ( i componenti server delle applicazioni) svolgono il lavoro per conto di molti client , i dati ai quali i componenti (logici) del server accedono devono essere unici per ciascun client. Spesso i dati sono trattati come globali: nel corso della manipolazione di essi per conto di molti client non è possibile garantire che i dati globali siano unici, pertanto occorre codificare le applicazioni per l’uso dei dati di ciascun client. Occorre raggruppare in una struttura tutti i dati attinenti a ciascun componente di richiesta di servizi (client); generalmente, per ciascun client richiedente viene creata un’istanza della struttura e le modifiche apportate ai dati dal componente server dell’applicazione si basano pertanto sulla struttura di dati dell’utente del client individuale. Il linguaggio Java accede ai dati modulari raggruppando tutti i dati e tutte le funzioni all’interno di una classe: questo incapsulamento fornisce un meccanismo naturale per l’accesso ai dati da parte dei singoli client.
  • Integrazione di un meccanismo di Richiesta/Risposta: va sviluppato un meccanismo per la comunicazione tra i componenti di richiesta (client) e quelli di risposta (server), spesso questo lavoro richiede una quantità consistente di codifica.
  • Eliminazione delle dipendenze sottostanti del sistema: poiché alcune parti del programma applicativo client-server possono essere eseguite su macchine diverse, è importante eliminare le dipendenze sottostanti del sistema operativo dal codice delle applicazioni: questo è necessario in quanto sovente la macchina client e la macchina server su cui l’applicazione viene eseguita sono diverse (dal punto di vista hardware). Il linguaggio Java in questo caso è di grande aiuto poiché e del tutto indipendente dalla piattaforma e i tipi di dati sono rappresentati sempre allo stesso modo su ogni sistema.
  • Attuazione della modularità: è necessario creare una modularità dell’architettura del sistema client-server che si vuole implementare, attuando questa modularità a livello dei componenti fa si che l’interazione tra i componenti del sistema client-server possa essere gestita con continuità. Il linguaggio Java essendo orientato agli oggetti "impone" una struttura di tipo modulare.
      Gestione dell’interazione tra client e server
        Un problema che si pone nelle architetture client-server è quello di creare un meccanismo per le comunicazioni tra i componenti client e server delle applicazioni. La distribuzione dei componenti delle applicazioni attraverso una rete comporta la necessità di costruire qualche mezzo di interazione, sono disponibili diverse soluzioni a questo problema.

        In genere per l’interazione dei componenti delle applicazioni sono definiti tre strati (Figura 4.4):

        Figura 4.4 Strati dell'interazione tra componenti client e server.

         

        Protocollo di rete

          Esiste un’ampia gamma di protocolli di rete tra cui scegliere, in passato gli sviluppatori di applicazioni client-server dovevano scegliere un protocollo di comunicazione e quindi codificare manualmente l’interazione client-server, oggi la scelta diventa automatica in base al tipo di "ambiente" a cui ci si rivolge, nell’esempio di Internet il protocollo di rete sarà il TCP/IP.
        Tecniche di comunicazione
Le tecniche di comunicazione sono ben definite e forniscono allo sviluppatore il meccanismo per trasferire i dati delle applicazioni dal client al server, il protocollo di interazione delle applicazioni può variare in base alla scelta della tecnica di comunicazione.

L’odierno ambiente delle comunicazioni tra client e server concede ai programmatori una elevata flessibilità per la progettazione delle applicazioni, esistono diverse tecniche di comunicazione idonee a soddisfare le esigenze di interazione client-server. Ciascuna di queste tecniche di comunicazione può essere adottata indipendentemente dal protocollo di rete sottostante.

Esistono generalmente quattro meccanismi per gestire l’interazione tra client e server:

  • Chiamante di procedure remote (Remote Procedure Calls, RPC): le RPC costituiscono un metodo rapido per sviluppare il codice delle applicazioni client-server, soprattutto quando si tratta di convertire programmi autonomi in componenti client-server. C’è da dire però che la codifica delle RPC è un processo difficile, inoltre esse hanno una natura estremamente sincrona: questo significa che quando un client effettua una richiesta RPC alla procedura server, resta bloccato fino al completamento della funzione e alla restituzione dei risultati da parte del server.
  • Protocolli di comunicazione nativi: si costruisce un proprio protocollo di interazione tra le applicazioni client e quelle server, ciò comporta solitamente la specifica di un componete di interfaccia di rete che gestisce specificamente i protocolli di comunicazione, crea legami di comunicazione, invia e riceve i dati.
  • Messaggi: un meccanismo oggi diffuso per l’interazione client-server è l’uso dei prodotti di comunicazione mediante messaggi: tali prodotti trasmettono le comunicazioni tra il client e il server in forma di messaggi; questi ultimi vengono solitamente elaborati da un meccanismo di accodamento nel nodo ricevente. Per definizione, i prodotti per la comunicazione mediante messaggi sono di natura estremamente asincrona e si comportano di conseguenza, i messaggi sono molto flessibili in quanto possono essere inoltrati ad altri sistemi o memorizzati per l’elaborazione differita. Inoltre, i prodotti di comunicazione mediante messaggi eliminano la necessita del faticoso supporto al protocollo di rete sottostante da parte dello sviluppatore.
  • Orientamento agli oggetti: quest’ultima è una tecnologia emergente per la distribuzione di applicazioni. Dal punto di vista logico gli oggetti si adattano perfettamente all’ambiente client-server. Poiché l’implementazione di ciascun oggetto è mascherata dall’interfaccia a oggetti, gli oggetti possono diventare client-server senza eccessiva difficoltà. Inoltre i dati correlati sono incapsulati nell’oggetto in modo tale che l’utente della classe sia protetto dalla complessità e dall’implementazione sottostante.
Protocolli di interazione delle applicazioni client-server
Generalmente esistono due tipi teorici di progettazione per i protocolli di interazione delle applicazioni: i protocolli predefiniti e i protocolli flessibili. I componenti client-server solitamente hanno una conoscenza approfondita l’uno dell’altro, pertanto un protocollo predefinito potrebbe essere stabilito tra componenti in cui l’ordine e la modifica dei dati che li attraversano non cambiano. Viceversa, un protocollo flessibile potrebbe essere definito qualora non esista un formato predeterminato per i dati trasmessi: questo protocollo flessibile dovrebbe descrivere i dati mentre attraversano i sistemi.

La scelta di un protocollo di interazione delle applicazioni predefinito o flessibile è sovente dettata dalle applicazioni stesse. Alcune applicazioni si adattano molto bene a uno dei tipi di protocolli e dovrebbero essere realizzate di conseguenza. Un protocollo di interazione delle applicazioni predefinito obbliga l’applicazione client ad adattarsi, mentre con un protocollo flessibile i dati del client possono essere accettati e trasmessi tra i sistemi così come sono. Entrambi i protocolli presentano vantaggi e svantaggi significativi: un protocollo predefinito è preferibile per quanto riguarda la velocità e la semplicità ma è più impegnativo per quanto riguarda la programmazione lato client; un protocollo flessibile richiede meno impegno al programmatore del client inoltre i parametri delle procedure client possono essere impaccati senza che l’applicazione client debba conoscere a fondo la transizione client-server; tale protocollo può tuttavia essere meno efficiente.

L’efficienza dei protocolli deriva dalla preparazione, dalla trasmissione, dall’accettazione dalla consegna dei dati tra i sistemi. Importante diventa anche il meccanismo adottato sia dal client che dal server per impaccare e disimpaccare i dati trasmessi attraverso la rete. Con i protocolli flessibili, ciascun parametro deve essere impaccato e descritto individualmente. Questo processo può richiedere tempo , in base ai dati trasmessi tra i sistemi. Con un protocollo predefinito, i dati solitamente vengono trasmessi tra i sistemi in un formato che non richiede disimpaccamento: normalmente , un’applicazione client invia una struttura di dati che rappresenta i dati stessi tra i sistemi, mentre un’applicazione server riceve un puntatore a tale struttura di informazioni; con tale protocollo, non occorre impaccamento e disimpaccamento dei parametri.

E’ importante notare che il protocollo di interazione delle applicazioni client-server prescelto non deve avere alcuna dipendenza dal meccanismo di trasporto sottostante adottato per le comunicazioni in rete, questo significa che il protocollo di interazione delle applicazioni, se correttamente architettato, deve rimanere indipendente dai protocolli di comunicazione sottostanti.

I protocolli predefiniti al livello delle applicazioni sono prevalenti nelle applicazioni architettate fin dall’inizio per ambienti client-server. Questi protocolli sono inflessibili e di conseguenza sono estremamente efficienti per natura. Il motivo di questa efficienza è che né i componenti client né i componenti server delle applicazioni devono impaccare e disimpaccare parametri per le procedure: i parametri sono invece collocati nel client o conservati in un buffer predefinito delle applicazioni; nel server, le procedure sono smistate e trasmesse al buffer predefinito delle applicazioni, senza che il buffer debba essere disimpaccato in parametri per essere trasmesso alle procedure.

Generalmente per rappresentare un protocollo predefinito viene definita, dal programmatore una struttura per contenere tutte le interazioni delle applicazioni. La struttura possiede informazioni uniche dell’applicazione oppure dati di lunghezza variabile trasmessi tra il sistema client e il sistema server.

Quindi, in genere, il pacchetto di rete consiste nelle informazioni del protocollo di rete, nel protocollo al livello delle applicazioni e in dati di lunghezza variabile.

Il protocollo flessibile, invece, al livello delle applicazioni riduce al minimo il lavoro richiesto allo sviluppatore di applicazioni lato client, poiché un protocollo flessibile può descrivere più facilmente i dati trasmessi come parametri tra le funzioni, una quantità minore di lavoro di codifica è necessaria per lo sviluppatore e una quantità inferiore di modifiche è necessaria per impaccare, inviare, ricevere e restituire i dati dai componenti client-server.

La conversione dei parametri trasmessi tra i componenti procedurali di un protocollo flessibile è facilitata: il protocollo flessibile è studiato per consentire di posizionare un numero qualsiasi di parametri di tipo arbitrario in un buffer di dati per il trasferimento client-server. Generalmente il pacchetto di rete, per i protocolli flessibili, contiene un pacchetto di intestazione, il protocollo flessibile e dati di coda, questi ultimi hanno strutture miste che descrivono i dati trasferiti tra client e server.

Tecniche di realizzazione di applicazioni client server
Le tecniche per realizzare applicazioni client-server possono variare in larga misura, in base alle scelte specifiche operate da chi crea le applicazioni. Queste scelte determinano la modalità di creazione e gestione delle applicazioni, la modalità di interazione tra di esse e la loro efficienza. Le scelte di realizzazione, comunicazione e ottimizzazione possono ripercuotersi sull’applicazione client-server finale.

Per lo sviluppo di applicazioni client-server occorre la seguente architettura:
  • Identificazione e raggruppamento logico di operazioni simili: il raggruppamento delle procedure contribuisce a identificare le dipendenze dei componenti procedurali, in alcuni casi, le dipendenze dovranno essere attenuate perché i componenti procedurali non sono eseguiti sulla stessa macchina.
  • Suddivisione delle applicazioni in componenti Richiesta/Risposta: ciascun componente deve essere separato mediante un meccanismo ben definito. L’architettura costituita da componenti di Richiesta/Risposta, fornisce tale ambiente, in cui il componente client effettua richieste al componente server e attende la restituzione dei risultati. L’interazione dei componenti quindi non si deve basare su interazione procedurale locale. L’interfaccia tra i componenti di richiesta e quelli di risposta può variare in larga misura ed è una questione di progettazione. Adottando le chiamate a procedure remote (RPC) molte funzioni o procedure effettuano comunicazioni remote con il server. Questi componenti procedurali sono distribuiti mediante un modello di Richiesta/Risposta sincrona. Un’impostazione simile convoglia tutte le richieste procedurali del server attraverso una singola funzione o interfaccia; altri metodi di avvalgono di un’interfaccia basata sui messaggi per questa interazione. Qualunque sia il meccanismo impiegato come interfaccia ai componenti di richiesta risposta, il valore fondamentale deve essere di modellare un’interazione tra i componenti logici discreti delle applicazioni e mascherare la posizione fisica dell’esecuzione.
  • Creazione di funzioni "rientranti": i componenti di risposta (server) devono essere architettati nell’ottica dei componenti di richiesta. I componenti server possono essere eseguiti contemporaneamente per conto di più client; in ambienti che supportano i thread, è importante che i componenti server siano rientranti: rientrante vuol dire che una procedura applicativa può essere chiamata più volte ed essere eseguita contemporaneamente senza causare alcun disturbo. Le applicazioni server che supportano i thread distribuiscono un thread per ciascuna connessione client. Ogni thread eseguirà molte funzioni simili per conto dei componenti di richiesta: ciascuna procedura eseguita simultaneamente deve avere caratteristiche rientranti. Le variabili globali devono essere evitate perché la loro modifica cambia il valore contenuto in altri thread effettuando la stessa chiamata di procedura.
  • Accesso ai dati specifici per ciascun client: la suddivisione in componenti di richiesta (client) e componenti di risposta (server) implica che ogni accesso ai dati per conto del componente di risposta dovrà essere effettuato per ciascun singolo componente di richiesta. Poiché le funzioni del server devono essere rientranti, i dati devono essere contenuti localmente (dal client) oppure bisogna coordinare l’accesso ai dati globali. I dati specifici di ciascun client sono molto importanti per i componenti server delle applicazioni, in quanto consentono di far riferimento ai dati del client al di fuori dell’ambito di una singola procedura senza provocare modifiche accidentali, come invece avverrebbe con le variabili globali.
Ottimizzazione delle applicazioni client-server
La riduzione al minimo della quantità di dati trasmessi tra il client e il server è della massima importanza e può essere ottenuta in due modi: innanzitutto, è possibile ridurre il numero dei parametri o la quantità di dati da trasmettere, inviando così al server solo ciò che è necessario; secondariamente, il server potrebbe conservare i dati simili trasmessi dal client ad ogni chiamata di funzione, le informazioni di stato, per esempio, possono essere conservate nel server. Inoltre , l’elaborazione server dei dati del client può essere ottimizzata con l’uso di protocolli predefiniti delle applicazioni (o l’impiego limitato dei protocolli flessibili) che consentono all’applicazione server di essere più efficiente nell’elaborazione delle richieste dei client; questo processo può essere ulteriormente potenziato da un meccanismo di accodamento efficiente per l’applicazione server.
  • Riduzione al minimo della quantità di dati trasmessi tra il client e il server: La riduzione al minimo della quantità di dati trasmessi è uno strumento di ottimizzazione quanto mai ovvio per le applicazioni client-server: quantità ingenti di dati rallentano le applicazioni, il sistema può dare l’impressione di non rispondere se la maggior parte del tempo di esecuzione viene sprecata per la trasmissione di dati non necessari. La riduzione al minimo di queste trasmissioni assicura un impatto minimo dell’utente verso l’applicazione e l’impiego limitato della rete fisica. Il trasferimento di quantità consistenti di dati attraverso una rete aumenta il carico di lavoro delle infrastrutture fisiche: la larghezza di banda della rete fisica è una risorsa statica è non deve essere consumata con dati inutili. Inoltre, le applicazioni sono rallentate dall’elaborazione delle grandi quantità di dati.
  • Conservazione dei dati nel server: un altro metodo per ridurre al minimo la quantità di dati che passano tra il client e il server consiste nel conservare nel server i dati simili. Per le connessioni client-server che comportano molte interazioni tra client e server, alcune informazioni essenziali possono essere trasmesse ad ogni chiamata: generalmente, queste informazioni di stato possono essere facilmente eliminate dalla rete se il server memorizza i dati delle precedenti chiamate del client. Conservando questi dati nel server, l’efficienza dell’applicazione client-server risulta migliorata.
  • Elaborazione dei protocolli predefiniti delle applicazioni: la realizzazione e la rapida elaborazione dei protocolli predefiniti delle applicazioni sicuramente miglioreranno le prestazione delle applicazioni server; questi protocolli sono potenziati da un duplice meccanismo: innanzitutto sono inflessibili quindi richiedono una quantità di tempo minima per inserire i dati nei buffer di comunicazione secondariamente, possono essere elaborati in modo efficiente dall’applicazione server, se correttamente architettati. Un componete server può essere o non essere consapevole della propria esecuzione come componente server separato. L’ottimizzazione dell’esecuzione basata sull’elaborazione efficiente dei protocolli al livello delle applicazioni richiede che il componente server sia estremamente consapevole delle proprie mansioni. L’elaborazione server dei protocolli al livello delle applicazioni può essere ottimizzata trasmettendo i veri e propri buffer dei protocolli alla procedura server per l’elaborazione.
  • Server che elabora le code: l’elaborazione efficiente delle richieste del client da parte del server è essenziale per ottimizzare le applicazioni client-server: questo processo è sensibilmente potenziato dall’uso efficiente delle code. Le code di rete accelerano l’elaborazione degli eventi avviati dal client esse si adattano naturalmente all’interfaccia di un componete basato sui messaggi, in quanto i messaggi trasmessi tra i sistemi vengono elaborati dalle code. Le code non si limitano tuttavia ai messaggi e possono essere utilizzate per elaborare anche la distribuzione delle applicazioni basata su procedure. Le code servono a tutti i livelli dell’esecuzione dei componenti server: potenzialmente , vengono utilizzate tanto dall’interfaccia quanto dai meccanismi di comunicazione, accettazione e distribuzione che un’interazione client-server deve sostenere.
Realizzazioni client-server
La Figura 4.5 illustra la divisione necessaria tra client e server, esiste una barriera quella dell’accettazione tra i componenti di richiesta (client) e quelli di risposta (server).

 

 

Figura 4.5 La divisione del lavoro dei componenti client-server.

 

Questa architettura per le applicazioni può essere realizzata creando le funzioni e le procedure delle applicazioni come componenti autonomi. Ciascun componente può interagire con gli altri solo tramite questa interfaccia ben definita. I componenti autonomi delle applicazioni sono un requisito della programmazione client-server.

Sviluppare applicazioni client-server vuol dire operare scelte architettoniche importanti fin dall’inizio: la scelta dell’interfaccia tra i componenti è una decisione fondamentale che determina la modalità di interazione delle applicazioni client-server.

In genere ogni metodo, o meglio qualsiasi interazione client-server ha le seguenti caratteristiche principali:

  • L’interfaccia tra i componenti di Richiesta/Risposta.
  • La formulazione delle richieste da parte del client.
  • La trasmissione delle richieste tra i componenti.
  • L’accettazione e il disimpaccamento delle richieste provenienti dal client.
  • L’esecuzione delle richieste da parte del server.
Per l’interazione tra i componenti client e server, occorre compiere una serie di operazioni: tra i componenti di richiesta e di risposta deve essere definita un’interfaccia che varierà in base alla tecnica di comunicazione adottata. Le richieste devono quindi essere suddivise nel client, comunicate al server, accettate ed eseguite. La formulazione e l’accettazione delle richieste variano in base all’implementazione. I requisiti essenziali della trasmissione e dell’esecuzione rimarranno relativamente simili indipendentemente dall’interfaccia prescelta tra i componenti client e server. E’ interessante anche notare che affinché le comunicazioni client-server abbiano luogo in modo sicuro, sarebbe necessaria implementare qualche forma di autenticazione dei client: questo dovrebbe essere eseguito al momento del contatto iniziale tra il client e il server.

 | Index | Next | Prev. |