Networking cenni Docente Gabriele Lombardi lombardidsi unimi it
Networking (cenni) Docente: Gabriele Lombardi lombardi@dsi. unimi. it © 2010 - CEFRIEL
The present original document was produced by CEFRIEL and the Teacher for the benefit and internal use of this course, and nobody else may claim any right or paternity on it. No right to use the document for any purpose other than the Intended purpose and no right to distribute, disclose, release, furnish or disseminate it or a part of it in any way or form to anyone without the prior express written consent of CEFRIEL and the Teacher. © copyright Cefriel and the Teacher-Milan-Italy-23/06/2008. All rights reserved in accordance with rule of law and international agreements. © 2010 - CEFRIEL
Sommario SLIDE CONTENUTO Problematiche di comunicazione sulla rete Strumenti di base URI, URL, indirizzi e porte Il client Usare le socket come client Il server Usare le socket nei server Modelli di server Server sequenziali e concorrenti © 2010 - CEFRIEL
Problematiche di networking n Comunicazione: – trasferimento dati su una tratta, instradamento; – assegnazione di un indirizzo per ogni host (IP): • indirizzi del tipo 159. 140. 6 (IPv 4); • 4 numeri tra 0 e 255; • associazione nomi (DNS); – utilizzo di protocolli well-known (ftp, HTTP, …). n Altre problematiche: – trasferimento dati “manualmente”: • utilizzo stream (java. io. *) tramite socket; – conversione dati host 2 network e network 2 host; – accesso a parametri di basso livello (campi dei pacchetti); – Authentication, Permissions, Proxy, Cookies, … © 2010 - CEFRIEL
Strumenti di base: URI e URL n URI (Unified Resource Identifier): – rappresenta l’identificativo univoco di una risorsa; – è della forma: [scheme: ]scheme-specific-part[#fragment] • mailto: java-net@java. sun. com – in particolare la versione gerarchica è: [scheme: ][//authority][path][? query][#fragment] n • http: //java. sun. com/j 2 se/1. 3/ La classe java. net. URI: – permette parsing e validazione dell’URI; – permette di ottenerne l’URL associato. n URL (Unified Resource Locator): – rappresenta la locazione da cui è possibile reperire una risorsa; – segue lo schema gerarchico di URI; – permette di accedere ai dati della risorsa tramite stream: • URL url = new URL(“http: //www. google. com”); • Input. Stream is = url. open. Stream(); © 2010 - CEFRIEL
Strumenti di base: indirizzi n Inet. Address, Inet 4 Address, Inet 6 Address: – indirizzi IP (Interenet Protocol v 4 e v 6); – generato tramite factory method: – Inet. Address addr 1 = Inet. Address. get. By. Name(“ 159. 140. 6”); – Inet. Address addr 2 = Inet. Address. get. By. Name(“google. com”); n • si noti che addr 2 viene risolto tramite DNS; porte (interi positivi): – l’indirizzo IP identifica un host, la porta identifica il servizio richiesto (processo in ascolto sulla porta); n Inet. Socket. Address: – rappresenta un indirizzo di una socket; – è definito come unione di un IP e una porta: – Inet. Socket. Address addr = new Inet. Socket. Address( Inet. Address. get. By. Name(“google. com”), 80); © 2010 - CEFRIEL
Socket attive (client) n java. net. Socket: – rappresenta la “cornetta del telefono”, un capo della comunicazione bidirezionale realizzabile con TCP/IP; – è identificata da un indirizzo Inet. Socket. Address; – stabilisce la connessione con un altro Inet. Socket. Address; – consente di aprire due canali di comunicazione: – Socket soc = new Socket(“www. google. com”, 80); – Input. Stream is = soc. get. Input. Stream(); – Output. Stream os = soc. get. Output. Stream(); • a questo punto la comunicazione è stabilita; • delle eccezioni possono indicarci il fallimento; – va chiusa al termine della comunicazione: – soc. close(); n • non si può chiudere parzialmente questo tipo di socket (al più disabilitare input oppure output). java. net. Datagram. Socket, java. net. Multicast. Socket: – strumenti per la comunicazione a datagramma (UDP). © 2010 - CEFRIEL
Socket attive (client) // Creo la socket di comunicazione col server: Inet. Address indirizzo = Inet. Address. get. By. Name(servername); Socket soc = new Socket(indirizzo, porta); // Chi siamo? System. out. println("Io sono: " + soc. get. Local. Address() + "/" + soc. get. Local. Port()); System. out. println("Io cerco: " + soc. get. Inet. Address() + "/" + soc. get. Port()); // Ottengo gli stream di comunicazione: Output. Stream os = soc. get. Output. Stream(); Input. Stream is = soc. get. Input. Stream(); vedere 05_NetworkingClient. Fuffo con: esempio di base client esempio di base server // Un po’ di comodità! Writer writer = new Output. Stream. Writer(os); Buffered. Reader reader = new Buffered. Reader(new Input. Stream. Reader(is)); // Comunico la richiesta HTTP: String richiesta = inizio. Richiesta + risorsa + "nn"; writer. write(richiesta); writer. flush(); // Lettura della risposta: String linea; while((linea=reader. read. Line())!=null) { System. out. println(linea); } // Fine: reader. close(); writer. close(); © 2010 - CEFRIEL
Socket passive (server) n java. net. Server. Socket: – rappresentano servizi in ascolto per richieste; – non vengono usate per comunicare … • … ma per accettare comunicazioni; – Server. Socket ssoc = new Server. Socket(num. Porta); – Socket soc = ssoc. accept(); // Attendo l’arrivo di una richiesta! n • a questo punto soc è connessa con il client. Socket. Impl, Datagram. Socket. Impl: – implementazioni astratta delle socket; – consente di sostituire l’implementazione concreta; – utile se si vuole usare una propria implementazione. n Socket. Impl. Factory, Datagram. Socket. Impl. Factory: – interfacce da implementare se si vuole realizzare una propria implementazione delle socket TCP e UDP. © 2010 - CEFRIEL
Socket passive (server) // Creo la socket: Server. Socket ss = new Server. Socket(porta); while (true) { // Per sempre! // Aspetto che qualcuno si connetta a me: Socket soc = ss. accept(); System. out. println("Io sono: " + soc. get. Local. Address() + "/" + soc. get. Local. Port()); System. out. println("Io cerco: " + soc. get. Inet. Address() + "/" + soc. get. Port()); // Ottengo gli stream di comunicazione: Output. Stream os = soc. get. Output. Stream(); Input. Stream is = soc. get. Input. Stream(); vedere 05_NetworkingClient. Fuffo con: esempio di base client esempio di base server // Un po’ di comodità! Writer writer = new Output. Stream. Writer(os); Buffered. Reader reader = new Buffered. Reader(new Input. Stream. Reader(is)); // Ottengo in ingresso i dati: System. out. println("Richiesta: " + reader. read. Line()); // Mando una risposta: writer. write("Ciao!n"); writer. flush(); vedere 04_ConcurrencyChat con: server concorrente client che comunica col server mini-protocollo proprietario // Chiudo tutto: reader. close(); writer. close(); } © 2010 - CEFRIEL
Tipologie di server n Lo scopo del server è quello di soddisfare richieste … – … più richieste possono arrivare assieme. n Server. Socket mantiene una lista di richieste pendenti: – quindi il precedente programma soddisfa tutte le richieste in arrivo (entro i limiti) senza perderne nessuna … – … ma ogni client deve attendere “in fila” prima di poter essere servito dall’unico processo. n La soluzione consiste nel cambiare modello di server: – i modelli classici sono: • server sequenziale (quello mostrato precedentemente); • server concorrente (delega il compito di rispondere a un processo); • server concorrente con select (ascolto su porte multiple). – Soluzione: passare al modello concorrente. © 2010 - CEFRIEL
Esempio di server concorrente // Faccio sempre la stessa cosa: while (true) { try { // Ascolto la socket: Socket soc = ssoc. accept(); // Gestisco la comunicazione in un thread separato: esecutore. execute( new Gestore. Messaggio. Entrante(soc) { public void run() { try { // Connessione stabilita, ottengo il messaggio: Object. Input. Stream ois = new Object. Input. Stream(soc. get. Input. Stream()); Messaggio msg = (Messaggio)(ois. read. Object()); // Fine comunicazione: ois. close(); // Gestisco il messaggio: System. err. println("Ricevuto messaggio da: " + msg. get. Mittente()); ricevuto(soc. get. Inet. Address(), msg); } catch (Exception e) { e. print. Stack. Trace(); } } }); } catch (Exception e) { e. print. Stack. Trace(); } } © 2010 - CEFRIEL vedere 04_ConcurrencyChat con: server concorrente client che comunica col server mini-protocollo proprietario
- Slides: 12