Protocollo FTP FTP Client Telematica II FTP Server TCP control connection (port 21) 21) TCP data connection (port (port 20) 20) File System remoto File System locale 15. Esercitazione/Laboratorio 5 La connessione di controllo è persistente ed identifica una sessione (necessaria autenticazione mediante login / logout) La connessione dati non è persistente, nell’ambito di una sessione, per ogni ambito file trasferito è creata una nuova connessione dati (il server è in ascolto sulla porta 20 in attesa di nuove connessioni) Corso di Laurea in Ingegneria Informatica A.A. 2009-2010 2° Semestre Prof. Giovanni Pascoschi 2 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercitazione 7 – MiniFTPServer Esercitazione su protocollo FTP – lato server #2 richiesta di connessione di controllo su porta 21 client server Socket internet socket socket Realizzare un mini server FTP che gestisce solo il login anonimo ed i comandi PORT, RETR e QUIT (esercitazione 11FS) server FTP connessione dati stabilita su porta 20 del server 3 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 4 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercitazione 7 – MiniFTPServer (UML) Esercitazione su protocollo FTP – lato server #1 Per utilizzare le classi JAVA utili alla gestione dei socket: import java.net.*; MiniFTPServer Server miniFTP (gestisce solo i comandi USER, PASS, PORT, RETR, QUIT) 1. Creare un ServerSocket (servSocket) indicando il numero di porta 2. Mettersi in attesa di connessione da parte del client; a connessione stabilita si ottiene un oggetto di classe Socket (link) 3. Ottenere gli stream di input e output associati al Socket 4. Comunicare con il client usando gli stream di I/O per leggere (=ricevere) e scrivere (=inviare) datiÆ processa richiesta (processRequest) 5. Nel caso di comando RETR, inviare il file su una nuova connessione Socket (dataSock) sul server 6. Chiudere il Socket dataSock sul server 5 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 6 Telematica II – A.A. 2009-2010 costruttore metodo main metodo di avvio del server metodo di fermata del server metodo nucleo centrale del server metodo di elaborazione della richiesta metodo di invio al client a cura di Pascoschi Giovanni ..... int address[ ] = new int[6]; // array di 6 interi int start = 5; // indice iniziale della sottostringa int i; for (i=0; i<5; i++) { int end = request.indexOf(",", start); //estrazione dell’indice di ‘,’ address[i] = Integer.parseInt(request.substring(start, end)); //estrazione sottostringa dalla posizione start alla posizione end-1 start = end + 1; // incremento di start alla sottostringa successiva (dopo la ‘,’) } dove i primi 4 numeri costituiscono l’indirizzo IP e i successivi due la porta da utilizzare con la formula n5*256+n6. Implementare un programma in Java che permette di ricavare clientAddress di classe InetAddress da n1, n2, n3 e n4 e clientDataPort da n5 e n6. a cura di Pascoschi Giovanni username fornito dal client indirizzo IP client porta client Esercitazione 7 – MiniFTPServer (parsing) #1 Problema (parsing di un testo): Abbiamo una riga di testo nel formato “PORT n1,n2,n3,n4,n5,n6” Telematica II – A.A. 2009-2010 flag di stato + MiniFtpServer(String ftpRoot) + void main(String[ ] args) + void start( ) + void stop( ) + void serve( ) + void processRequest(String request, Printwriter response) + void send(StringBuffer b) Esercitazione 7 – MiniFTPServer (parsing) 7 oggetto servSocket percorso root FTP + ServerSocket servSocket - String ftpRoot - boolean running - boolean session - boolean userflag - boolean login - boolean portflag - String username - InetAddress clientAddr - int clientDataPort 8 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercitazione 7 – MiniFTPServer (parsing) #2 Esercitazione 7 – MiniFTPServer address[5] = Integer.parseInt(request.substring(start)); // estrazione ultima sottostringa partire dalla posizione start for (i=0; i<6; i++) { if (address[i]<0 || address[i]>255) { //check validità numeri throw new Exception("Argomento non valido"); } } clientAddr = InetAddress.getByName(address[0] + "." + address[1] + "." + address[2] + "." + address[3]); //ind. IP client clientDataPort = 256*address[4] + address[5]; //porta client 9 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Viene illustrato un esercizio MiniFTPServer sulla gestione del protocolllo FTP sul server (esercitazione 11FS) 10 Esercitazione 7 – MiniFTPServer Q&A Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercitazione su protocollo FTP – lato server (riepilogo) nell’esercitazione e’ rispettata la RFC 959 FTP? struttura tipica di un server TCP accesso autenticato? implementati tutti i comandi? la logica del protocollo applicativo (FTP) è incapsulata in un metodo (processRequest) Æ è piu’ comodo gestire il protocollo applicativo sono usate le porte 21 e 20 del server come specifica? ¾ ¾ ad ogni passo distingue quale comando è stato ricevuto e lo esegue variabili di stato della sessione (da cui dipende l'esito della richiesta) ¾ gestione codici di risposta e di errore per utilizzare una specifica porta nel socket di tipo “client” sul server è necessario usare il costruttore socket a 4 parametri: public Socket(InetAddress interface, int localPort) host, int port, InetAddress funzionerà il client ftp standard con questo mini server FTP? 11 Æ implementare per esercizio il lato client di questo miniserver FTP Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 12 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Pausa Sessioni di esame luglio 2010 giorno 8/7/2010 aula L dalle ore 14.10 giorno 20/7/2010 aula L dalle ore 14.10 Pausa / Questionario il progetto deve essere consegnato almeno 10 giorni prima dell’esame orale il progetto (funzionante) deve comprendere oltre che i sorgenti, anche una breve relazione esplicativa le modalità complete di iscrizione compariranno sul sito del corso 13 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 14 JAVA Collections Framework Telematica II – A.A. 2009-2010 all’esame a cura di Pascoschi Giovanni La Standard Template Library in C++ (STL) La Standard Template Library (STL) comprende tre tipologie di componenti: ¾ Contenitori (p.e. vector, list, map) ¾ Iteratori ¾ Algoritmi Collections Framework I contenitori sono strutture dati come vettori, liste, pile, code e mappe, implementati con il meccanismo dei template, in grado di memorizzare oggetti di qualsiasi tipo Gli iteratori sono puntatori utilizzati per accedere e manipolare gli oggetti memorizzati nei contenitori in maniera semplificata Gli algoritmi comprendono funzioni d’utilità per il conteggio, l’ordinamento, la ricerca, ed altre operazioni standard sui contenitori. Æ La risposta JAVA alla STL-C++ è la Collections Framework 15 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 16 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni JAVA Framework Collections JAVA Framework Collections - tipologia Collection, Iterator Lists, ListIterator List ArrayList LinkedList Stack Framework (a livello software): “... is a general system of components and architectural solutions that provides development tools to programmers for use with a relatively wide range of applications” Æ soluzioni architetturali utili ai programmatori Queue, PriorityQueue Collection: “... is any collection of elements ....” Æ insieme di elementi (oggetti) utili nella gestione a livello software 17 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Sets Set TreeSet HashSet 18 JAVA Framework Collections - gerarchia Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Maps Map TreeMap HashMap Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Generics JAVA prima della versione JAVA 5 le collections usavano il tipo object (tipo generale di oggetto) a partire da JAVA ver.5, una collection contiene oggetti di uno specifico tipo. Una classe o interfaccia collection puo’ usare il tipo di oggetto come “parametro” Æ E è il tipo di oggetto (p.e. E = String oppure Auto, Dipendente, ecc) Æ si parla in questo caso di generics (in maniera analoga alle classi Template in C++) Collection<E> List<E> Stack<E> Set<E> le Colletions Framework sono costruite sulla base di classi astratte rappresentate da interfacce che le descrivono in base alle operazioni da esse supportate 19 tutte queste classi ed interfacce fanno parte del package java.util. I nomi in corsivo riguardano le interfacce. una map (mappa / array parallelo), che è una specie di dizionario (chiave / valore), considera due parametri come tipo di oggetto: Map<K,V> 20 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni La classe ArrayList #1 La classe ArrayList #2 i metodi principali di un ArrayList sono: un ArrayList<E> rappresenta una lista come un array dinamico di oggetti di tipo E , cioè che si ridimensiona quando è pieno (è simile al vector della STL C++) ¾ void add(int indice, E ogg) Æ inserisce l’oggetto di classe E nella lista in posizione “indice”Æ gli elementi successivi vengono shiftatiÆnessun elemento è sovrascritto fornisce un accesso random agli elementi ¾ E get(int indice) Æ restituisce l’oggetto memorizzato nella lista in posizione “indice” ¾ int indexOf(Object ogg) Æ restituisce l’indice della prima istanza di ogg nell’elenco. Se ogg non esiste, restituisce -1 ¾ E remove(int indice) Æ elimina l’oggetto nella posizione “indice”Æ gli altri elementi vengono scalati/compressi ¾ E set(int indice, E ogg) Æ assegna ogg all’elemento presente nella posizione “indice” sovrascrivendolo ¾ List<E> subList(int inizio, int fine) Æ restituisce un elenco/lista di elementi tra inizio e fine implementa tutti i metodi di List<E> da non confondersi con LinkedList Æ lista doppiamente linkata circolare ArrayList<String> al = new ArrayList<String>( ); 21 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 22 Iteratori #1 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Iteratori #2 un iteratore (iterator) può essere immaginato come un indice posto tra due elementi consecutivi un iteratore è un oggetto che aiuta a scorrere tutta la collection (ossia processare tutti gli elementi in sequenza) Æ esempio del foreach all’atto della costruzione, si trova prima del primo elemento for(tipo var-itr : collection) { istruzioni1; ........ }; la chiamata al metodo next() provoca l’avanzamento alla posizione successiva (se esiste) o la generazione di un’eccezione remove() elimina l’ultimo elemento restituito (quello che precede il puntatore, se esiste) 23 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni for(int x: numeri) { sum += x; } 24 Telematica II – A.A. 2009-2010 // scorre tutto l’array numeri a cura di Pascoschi Giovanni Iteratori #3 Algoritmi nella JCF nella classe generale Collections esistono diversi algoritmi già prontiÆ quelli piu’ noti sono (metodi statici): come si crea un iterator? Æ si richiama il metodo iterator di ciascuna collection Collections.sort(argList); // ordina in ordine crescente Collections.reverse(argList); // inverte l’ordine degli elementi Collections.shuffle(argList); // elementi in ordine pseudocasuale List<String> al = new ArrayList<String>( ); Iterator<String> itr = al.iterator ( ); per usare gli iteratori o si usano i cicli foreach, oppure si usa il metodo hasNext( ) per verificare se esiste un elemento successivo nella collection System.out.println(itr.next( )); // stampa l’elemento successivo nella lista 25 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 26 Map nella JCF Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Map – principali metodi nella JCF l’implementazione piu’ usata è data da una classe HashMap Æ una map (interface) non è una collection intesa come insieme singolo Æ è una corrispondenza tra un insieme di chiavi e un insieme di valori Map<String,Integer> argCount = new HashMap<String,Integer>( ); i metodi piu’ usati sono: solo un unico valore puo’ corrispondere a una determinata chiave; diverse chiavi possono essere mappate sullo stesso valore keys 27 Telematica II – A.A. 2009-2010 values a cura di Pascoschi Giovanni 28 ¾ V get(Object k) Æ restituisce il valore V associato ad un oggetto chiave k ¾ V put(K k, V v) Æ inserisce una voce nella mappa sovrascrivendo il valore precedente associato alla chiave k Æ restituisce null se la chiave non esisteva, altrimenti il valore precedente ¾ boolean isEmpty( ) Æ restituisce true se la map è vuota, altrimenti false ¾ void clear( ) Æ elimina tutte le coppie chiave/valore ¾ V remove (Object k) elimina la voce con chiave k ¾ int size( ) Æ restituisce il numero di coppie chiave/valore presenti nella mappa Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercitazione 8 – JAVA Collections Framework Riepilogo della lezione Esercitazione/Laboratorio 5 Gestione protocollo FTP su server Esercitazione sulla gestione del protocollo FTP lato server JAVA Collections Framework (panoramica) Esercitazione sulle JAVA Collections Framework Viene illustrato un esercizio CollectionsExample sulla gestione delle Collections Framework (esercitazione 6FS) 29 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 30 Fine della lezione Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercizio n.12 Realizzare un’ applicazione FTP client che possa interfacciarsi con il mini server FTP visto a lezione Domande? 31 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni 32 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni Esercizio n.13 33 Telematica II – A.A. 2009-2010 Esercizio n.14 a cura di Pascoschi Giovanni 34 Telematica II – A.A. 2009-2010 a cura di Pascoschi Giovanni