Applicazioni distribuite



Похожие документы
Socket & RMI Ingegneria del Software - San Pietro

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

Transmission Control Protocol

Programmazione dei socket con TCP #2

UDP. Livello di Trasporto. Demultiplexing dei Messaggi. Esempio di Demultiplexing

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

Programmazione Server Side e Database in rete

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Informatica per la comunicazione" - lezione 8 -

Nelle reti di calcolatori, le porte (traduzione impropria del termine. port inglese, che in realtà significa porto) sono lo strumento

Reti di Telecomunicazione Lezione 8

Reti di Telecomunicazioni Mobile IP Mobile IP Internet Internet Protocol header IPv4 router host indirizzi IP, DNS URL indirizzo di rete

Telematica II 12. Esercitazione/Laboratorio 4

appunti delle lezioni Architetture client/server: applicazioni server

Reti di Calcolatori. Il software

Dal protocollo IP ai livelli superiori

12.5 UDP (User Datagram Protocol)

Introduzione alle applicazioni di rete

Le reti. Introduzione al concetto di rete. Classificazioni in base a

Connessioni di rete. Progetto di reti di Calcolatori e Sistemi Informatici - Stefano Millozzi. PdR_ Stefano Millozzi

Esercizio 2. Client e server comunicano attraverso socket TCP

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

Architettura Client-Server

Prova in itinere - Rete Internet (ing. Giovanni Neglia) Mercoledì 23 Maggio 2007, ore 15.00

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

FTP. Appunti a cura del prof. ing. Mario Catalano

Cenni di programmazione distribuita in C++ Mauro Piccolo

Parte II: Reti di calcolatori Lezione 10

Programmare con le Socket

Programmare con le Socket TCP

Controllo Winsock di Visual Basic

Informatica per la comunicazione" - lezione 9 -

Programmare con le Socket TCP in java. 2: Application Layer 1

I Socket. Laboratorio Software M. Grotto R. Farina

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

PIANO DI LAVORO A.S. 2015/16

Standard di comunicazione

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Lo scenario: la definizione di Internet

Reti di Telecomunicazione Lezione 6

Applicazioni web. Parte 5 Socket

MODELLI ISO/OSI e TCP/IP

appunti delle lezioni Architetture client/server: applicazioni client

Rete Internet Prova in Itinere Mercoledì 23 Aprile 2008

InterNet: rete di reti

Oreste Signore, Responsabile Ufficio Italiano W3C Area della Ricerca CNR - via Moruzzi, Pisa

PARTE 1 richiami. SUITE PROTOCOLLI TCP/IP ( I protocolli di Internet )

Corso di Sistemi di Elaborazione delle informazioni. Reti di calcolatori 2 a lezione a.a. 2009/2010 Francesco Fontanella

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

T E O R I A D I P R O G E T T A Z I O N E D E L S O F T W A R E

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Protocollo di trasmissione Trova il Tuo Farmaco. Indice. Versione documento: 1.4 Data: 29/06/2011

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2007/8

Inizializzazione degli Host. BOOTP e DHCP

GLI APPARATI PER L INTERCONNESSIONE DI RETI LOCALI 1. Il Repeater 2. L Hub 2. Il Bridge 4. Lo Switch 4. Router 6

Applicazioni web centrati sui dati (Data-centric web applications)

Siti web centrati sui dati (Data-centric web applications)

Reti di Calcolatori:

Corso di Reti di Calcolatori L-A

Corso di Reti di Calcolatori

Indirizzi Internet e. I livelli di trasporto delle informazioni. Comunicazione e naming in Internet

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Corso di Reti di Calcolatori. Datagrammi

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

Altri tipi di connessione

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

OSOR. Applicazioni di Rete

Comunicazione tra Processi

I canali di comunicazione

Reti di Calcolatori. Lezione 2

Domande frequenti su Phoenix FailSafe

Reti commutate. Reti commutate. Reti commutate. Reti commutate. Reti e Web

I sistemi distribuiti

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Finalità delle Reti di calcolatori. Le Reti Informatiche. Una definizione di Rete di calcolatori. Hardware e Software nelle Reti

Reti diverse: la soluzione nativa

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca. Parte II Lezione 1

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

CORSO DI RETI SSIS. Lezione n.2. 2 Novembre 2005 Laura Ricci

Internet. Introduzione alle comunicazioni tra computer

ARCHITETTURA DI RETE FOLEGNANI ANDREA

Corso di Sistemi di Elaborazione delle informazioni. Reti di calcolatori 3 a lezione a.a. 2009/2010 Francesco Fontanella

Reti diverse: la soluzione nativa

Innanzitutto, esistono diversi modi per realizzare una rete o più reti messe insieme; vi illustro la mia soluzione :

SUITE PROTOCOLLI TCP/IP ( I protocolli di Internet )

Modulo 1.3 Reti e servizi

Il funzionamento delle reti

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Транскрипт:

Applicazioni distribuite Maurizio Cozzetto 1 agosto 2009 Un pò di teoria Ricordiamo che un'applicazione distribuita è un'applicazione composta da più programmi (almeno 2) posti in esecuzione su macchine diverse all'interno di una rete di calcolatori e che utilizzano un protocollo di comunicazione comune. I pc connessi a Internet comunicano tra loro usando diversi protocolli tra cui il più famoso è forse il TCP/IP (Transmission Control Protocol/Internet Protocol ) ben supportato da Java. Un altro protocollo è l'udp (User Datagram Protocol ). Il protocollo TCP/IP viene denito protocollo connection-oriented, orientato alla connessione, cioè garantisce che i pacchetti inviati arrivino a destinazione (se vi è un qualche errore il destinatario chiede la ritrasmissione del pacchetto), mentre l'udp non garantisce l'arrivo di tutti i pacchetti e viene denito connectionless. E' preferito in genere in tutti quei casi in cui perdite contenute di informazione durante la trasmissione sono trascurabili (come nelle trasmissioni audio-video) e quello che conta invece è la velocità di trasmissione. Java utilizza per la comunicazione in rete il paradigma di programmazione basato sul concetto di socket, progettato presso l'università di Berkley (California). Socket Il socket può essere denito come un punto terminale o di aggancio di una linea di comunicazione da cui un programma può inviare i dati in rete e può ricevere i dati dalla rete. Il socket (la traduzione è presa di corrente) è un'astrazione software che è in qualche modo l'equivalente della presa elettrica per gli apparecchi elettrici. In pratica un socket identica un computer e un processo sul computer; è formato da un indirizzo IP che identica un computer sulla rete e da un numero di porta TCP che identica un processo o un'applicazione sul computer. Il socket rappresenta solo uno dei due capi di una comunicazione; due computer per comunicare usano ciascuno un socket e tra i due socket si crea una connessione per il trasferimento dei dati in due direzioni. La realizzazione di applicazioni client/server in Java si basa sulle classi contenute nel package java.net e in particolare sulle classi InetAddress, ServerSocket e Socket. Ricordiamo brevemente che un programma è detto client se richiede un servizio a un programma detto server che fornisce il servizio richiesto e poi si rimette in ascolto in attesa di ulteriori richieste da parte di altri client. Può accadere frequentemente che su un server vi siano in esecuzione servizi diversi per cui, per distinguerli, si usa un numero identicativo del servizio, la porta appunto. Per esempio su una macchina server, potrebbero girare contemporaneamente il server web Apache, il server web Tomcat (un server web basato su Java) e il database server MySQL. Le porte impiegate sono la porta 80 per il server web, la porta 8080 (ma potrebbe essere diversa) per il server Tomcat e la porta 3306 per il database server MySQL. Le porte dalla 0 alla 1023 sono riservate ai principali servizi di rete conosciuti e sono dette anche well known ports. Inoltre un server singlethread (o server unicast) è un server che comunica con un solo client alla volta (se esistono altri client questi devono attendere il loro turno), mentre se il server è multithread (o server multicast) al server possono 1

Figura 1: Diagramma UML del meccanismo di comunicazione connettersi contemporaneamente più client (per ogni client, il server attiva un thread distinto). In quest'ultimo caso il server sposta la richiesta dalla porta sulla quale è stata eettuata la connessione su una nuova porta. Altra considerazione importante è che, una volta stabilita la connessione, la comunicazione tra client e server è basata sulla comunicazione tra ussi (stream), cioè l'invio e la ricezione dei dati sono gestiti in maniera simile alla gestione dei le. L'applicazione L'applicazione che presentiamo consiste di 3 thread: ClientThreadMax, che rappresenta il client, ServerThreadMax, che rappresenta il server e ThreadMax che rappresenta il thread del servizio richiesto dal client (in questo caso, il servizio richiesto è banalmente il massimo tra due numeri interi) e ingloba la logica dell'applicativo. Il funzionamento è il seguente: ServerThreadMax consiste di un ciclo innito di attesa di una qualche connessione sulla porta 10000 (un valore scelto a caso, qualsiasi altro valore maggiore di 1024 sarebbe andato altrettanto bene) mediante un oggetto di classe ServerSocket (righe dalla 22 alla 36 ). Una volta stabilita la connessione col client, rappresentata da un oggetto di classe Socket (riga 2 6), istanzia un thread di servizio per quel client e lo fa partire (righe 34 e 35 ). Poi torna a mettersi in ascolto sulla porta 10000. Il client ClientThreadMax crea una connessione col server all'indirizzo IP e sulla porta indicati nell'oggetto di classe Socket (riga 18 ). Poi genera due valori interi casuali e li invia, mediante lo stream di output associato al socket, al server (righe dalla 29 alla 35 ). Il server provvede ad elaborare i dati e li rinvia al client che li riceve sullo stream di input (riga 42 ). Il thread ThreadMax provvede a ricevere sullo stream di input associato i due valori (righe 26 e 27 ), ne calcola il risultato e provvede a inviarlo al client attraverso lo stream di output (righe dalla 30 alla 33 ). 2

Tutto questo in maniera concorrente con altri thread (parallelismo virtuale se vi è una sola CPU, reale se vi sono più CPU e la JVM supporta il multithreading reale). Il codice L'applicativo è stato testato in locale usando NetBeans 6.7, un ottimo IDE per lo sviluppo di applicazioni in Java (e non solo) e comprende, come già detto, le classi ServerThreadMax, ClientThreadMax e la classe ThreadMax. Di ogni classe per brevità riportiamo i frammenti essenziali (il progetto completo ClientServerMultiThreadJavaApp6 è scaricabile dal sito o direttamente dal link precedente). 3

Classe ServerThreadMax 1 / 2 ServerThreadMax. j a v a 3 / 4 package i t. m a u r i z i o c o z z e t t o. c l a s s i ; 5 import j a v a. i o. I O E x c e p t i o n ; 6 import j a v a. n e t. S e r v e r S o c k e t ; 7 import j a v a. n e t. S o c k e t ; 8 9 p u b l i c c l a s s ServerThreadMax extends Thread { 10 f i n a l s t a t i c i n t p o r t = 1 0 0 0 0 ; 11 S e r v e r S o c k e t s e r v e r S o c k e t ; 12 13 p u b l i c ServerThreadMax ( ) throws I O E x c e p t i o n { 14 // i s t a n z a d i un o g g e t t o d i c l a s s e S e r v e r S o c k e t 15 s e r v e r S o c k e t = new S e r v e r S o c k e t ( p o r t ) ; 16 } 17 18 @ O v e r r i d e 19 p u b l i c v o i d run ( ) { 20 t r y { 21 // c i c l o i n f i n i t o d i a t t e s a d e l l e c o n n e s s i o n i d e i c l i e n t 22 w h i l e ( t r u e ) { 23 24 // i l s e r v e r s i s o s p e n d e e rimane i n 25 // a t t e s a d e l l a c o n n e s s i o n e 26 S o c k e t s o c k e t = s e r v e r S o c k e t. a c c e p t ( ) ; 27 28 // o t t e n g o a l c u n e u t i l i i n f o r m a z i o n i s u l l a c o n n e s s i o n e 29 S t r i n g a d dr = s o c k e t. g e t I n e t A d d r e s s ( ). t o S t r i n g ( ) ; 30 i n t r e m o t e P o r t = s o c k e t. g e t P o r t ( ) ; 31 i n t l o c a l P o r t = s o c k e t. g e t L o c a l P o r t ( ) ; 32 33 // i s t a n z i o i l t h r e a d d i s e r v i z i o e l o f a c c i o p a r t i r e 34 ThreadMax threadmax = new ThreadMax ( s o c k e t ) ; 35 threadmax. s t a r t ( ) ; 36 } // f i n e c i c l o i n f i n i t o 37 } catch ( I O E x c e p t i o n e ) { 38 // E r r o r e d i IO 39 } // f i n e t r y c a t c h 40 } // f i n e metodo run 41 42 } // f i n e c l a s s e ServerThreadMax 4

Classe ClientThreadMax 1 / 2 ClientThreadMax. j a v a 3 / 4 package i t. m a u r i z i o c o z z e t t o. c l a s s i ; 5 import j a v a. i o. P r i n t S t r e a m ; 6 import j a v a. n e t. S o c k e t ; 7 import j a v a. u t i l. S c a n n e r ; 8 9 p u b l i c c l a s s C l i e n t T h r e a d M a x extends Thread { 10 s t a t i c f i n a l i n t p o r t = 1 0 0 0 0 ; 11 S o c k e t s o c k e t ; 12 S c a n n e r i n ; 13 P r i n t S t r e a m out ; 14 S t r i n g threadname ; 15 16 p u b l i c ClientThreadMax ( S t r i n g threadname ) throws UnknownHostException, 17 I O E x c e p t i o n { 18 t h i s. threadname=threadname ; 19 // c r e o i l s o c k e t 20 s o c k e t = new S o c k e t ( " l o c a l h o s t ", p o r t ) ; 21 22 // p r e p a r o g l i stream d i i n p u t e d i output d e l c l i e n t 23 i n = new S c a n n e r ( s o c k e t. g e t I n p u t S t r e a m ( ) ) ; 24 out = new P r i n t S t r e a m ( s o c k e t. getoutputstream ( ) ) ; 25 } // f i n e c o s t r u t t o r e 26 27 @ O v e r r i d e 28 p u b l i c v o i d run ( ) { 29 t r y { 30 // i n f o r m a z i o n i s u l l a c o n n e s s i o n e 31 S t r i n g a d d r = s o c k e t. g e t I n e t A d d r e s s ( ). t o S t r i n g ( ) ; 32 i n t r e m o t e P o r t = s o c k e t. g e t P o r t ( ) ; 33 i n t l o c a l P o r t = s o c k e t. g e t L o c a l P o r t ( ) ; 34 // g e n e r o due numeri i n t e r i c a s u a l i c o m p r e s i t r a 0 e 99 35 i n t n1 = ( i n t ) ( Math. random ( ) ( 9 9 ) ) ; 36 i n t n2 = ( i n t ) ( Math. random ( ) ( 9 9 ) ) ; 37 // i l c l i e n t i n v i a a l s e r v e r i due v a l o r i 38 // usando i l c a n a l e d i output 39 out. p r i n t l n ( n1 ) ; 40 out. p r i n t l n ( n2 ) ; 41 // i l s e r v e r e l a b o r a i l c a l c o l o ( i n q u e s t o caso i l massimo ) 42 // c r e a n d o un t h r e a d a p p o s i t o ( un o g g e t t o d i t i p o ThreadMax ) 43 // i l c l i e n t r i c e v e i l r i s u l t a t o d e l c a l c o l o s u l 44 // c a n a l e d i i n p u t 45 S t r i n g maxstr = i n. n e x t L i n e ( ) ; 46 // c h i u d o i l s o c k e t e g l i stream d i IO 47 s o c k e t. c l o s e ( ) ; 48 i n. c l o s e ( ) ; 49 out. c l o s e ( ) ; 50 } catch ( I O E x c e p t i o n e ){ 51 // E c c e z i o n e d i IO 52 } // f i n e b l o c c o t r y c a t c h 53 } // f i n e metodo run 54 } // f i n e c l a s s e ClientThreadMax 5

Classe ThreadMax 1 / 2 ThreadMax. j a v a 3 / 4 package i t. m a u r i z i o c o z z e t t o. c l a s s i ; 5 import j a v a. i o. I O E x c e p t i o n ; 6 import j a v a. i o. P r i n t S t r e a m ; 7 import j a v a. n e t. S o c k e t ; 8 import j a v a. u t i l. S c a n n e r ; 9 10 p u b l i c c l a s s ThreadMax extends Thread { 11 S o c k e t s o c k e t ; 12 S c a n n e r i n ; 13 P r i n t S t r e a m out ; 14 15 p u b l i c ThreadMax ( S o c k e t s o c k e t ) throws I O E x c e p t i o n { 16 t h i s. s o c k e t = s o c k e t ; 17 // i s t a n z i o i due stream d i IO 18 i n = new S c a n n e r ( t h i s. s o c k e t. g e t I n p u t S t r e a m ( ) ) ; 19 out = new P r i n t S t r e a m ( t h i s. s o c k e t. getoutputstream ( ) ) ; 20 } // f i n e c o s t r u t t o r e 21 22 @ O v e r r i d e 23 p u b l i c v o i d run ( ) { 24 t r y { 25 // i n f o r m a z i o n i u t i l i s u l l a c o n n e s s i o n e 26 S t r i n g a d dr = s o c k e t. g e t I n e t A d d r e s s ( ). t o S t r i n g ( ) ; 27 i n t r e m o t e P o r t = s o c k e t. g e t P o r t ( ) ; 28 i n t l o c a l P o r t = s o c k e t. g e t L o c a l P o r t ( ) ; 29 30 // l e g g o i l primo e i l secondo numero 31 i n t n1= I n t e g e r. p a r s e I n t ( i n. n e x t L i n e ( ) ) ; 32 i n t n2= I n t e g e r. p a r s e I n t ( i n. n e x t L i n e ( ) ) ; 33 34 // q u i s i c o n c e n t r a t u t t a l a l o g i c a d e l s e r v i z i o 35 i n t max = Math. max ( n1, n2 ) ; 36 37 // mando i n output s u l l o stream i l r i s u l t a t o 38 out. p r i n t l n ( max ) ; 39 40 // c h i u d o l a c o n n e s s i o n e c o l s o c k e t e g l i stream d i IO 41 s o c k e t. c l o s e ( ) ; 42 i n. c l o s e ( ) ; 43 out. c l o s e ( ) ; 44 } catch ( I O E x c e p t i o n e ){ 45 // E c c e z i o n e d i IO 46 } // f i n e b l o c c o t r y c a t c h 47 } // f i n e metodo run 48 49 } // f i n e c l a s s e ThreadMax 6

Esempio di esecuzione con 2 thread ServerThreadMax ==> Tento di creare l'oggetto di classe ServerThreadMax ServerThreadMax ==> Oggetto di classe ServerThreadMax creato ClientThreadMax-1 ==> Tento di creare il socket per connettermi al server... ServerThreadMax ==> ServerThreadMax attivo e in ascolto sulla porta 10000... ServerThreadMax ==> Indirizzo del client: /127.0.0.1 ServerThreadMax ==> Porta del client: 59322 ServerThreadMax ==> Porta locale: 10000 ClientThreadMax-1 ==> Socket creato ServerThreadMax ==> Creato nuovo ThreadMax per servire il client ServerThreadMax ==> ThreadMax avviato per il nuovo client ServerThreadMax ==> ServerThreadMax attivo e in ascolto sulla porta 10000... ThreadMax-1 ==> Indirizzo del client: /127.0.0.1 ThreadMax-1 ==> Porta remota: 59322 ThreadMax-1 ==> Porta locale: 10000 ThreadMax-1 ==> ThreadMax partito. Calcolo del massimo tra due numeri ClientThreadMax-2 ==> Tento di creare il socket per connettermi al server... ServerThreadMax ==> Indirizzo del client: /127.0.0.1 ServerThreadMax ==> Porta del client: 59323 ServerThreadMax ==> Porta locale: 10000 ServerThreadMax ==> Creato nuovo ThreadMax per servire il client ServerThreadMax ==> ThreadMax avviato per il nuovo client ServerThreadMax ==> ServerThreadMax attivo e in ascolto sulla porta 10000... ThreadMax-2 ==> Indirizzo del client: /127.0.0.1 ThreadMax-2 ==> Porta remota: 59323 ThreadMax-2 ==> Porta locale: 10000 ThreadMax-2 ==> ThreadMax partito. Calcolo del massimo tra due numeri ClientThreadMax-1 ==> Indirizzo del server: localhost/127.0.0.1 ClientThreadMax-1 ==> Porta del server: 10000 ClientThreadMax-1 ==> Porta locale: 59322 ClientThreadMax-1 ==> Genero n1 ClientThreadMax-1 ==> n1=49 ClientThreadMax-1 ==> Genero n2 ClientThreadMax-1 ==> n2=49 ClientThreadMax-1 ==> Invio i due valori al server ClientThreadMax-1 ==> Ricevo dal server il risultato ThreadMax-1 ==> Ho letto n1=49 dal client ThreadMax-1 ==> Ho letto n2=49 dal client ThreadMax-1 ==> Calcolo il max ThreadMax-1 ==> Il max vale 49 ThreadMax-1 ==> Invio il max al client ThreadMax-1 ==> Max inviato ThreadMax-1 ==> Chiudo la connessione col client e chiudo gli stream di IO ClientThreadMax-1 ==> Il massimo è: 49 ClientThreadMax-2 ==> Socket creato 7

ClientThreadMax-2 ==> Indirizzo del server: localhost/127.0.0.1 ClientThreadMax-2 ==> Porta del server: 10000 ClientThreadMax-2 ==> Porta locale: 59323 ClientThreadMax-2 ==> Genero n1 ClientThreadMax-2 ==> n1=90 ClientThreadMax-2 ==> Genero n2 ClientThreadMax-2 ==> n2=64 ClientThreadMax-2 ==> Invio i due valori al server ClientThreadMax-2 ==> Ricevo dal server il risultato ThreadMax-2 ==> Ho letto n1=90 dal client ThreadMax-2 ==> Ho letto n2=64 dal client ThreadMax-2 ==> Calcolo il max ThreadMax-2 ==> Il max vale 90 ThreadMax-2 ==> Invio il max al client ThreadMax-2 ==> Max inviato ThreadMax-2 ==> Chiudo la connessione col client e chiudo gli stream di IO ClientThreadMax-2 ==> Il massimo è: 90 8