Java Networking TCP J0 1. Marco Ronchetti - ronchet@altavista.it



Documenti analoghi
Architettura Client-Server

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Tecnologie Web L-A. Java e HTTP. Dario Bottazzi Tel , dario.bottazzi@unibo.it, SkypeID: dariobottazzi. Java e TCP/IP in a Nutshell

Introduzione alle applicazioni di rete

Parte II: Reti di calcolatori Lezione 10

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

Corso di Reti di Calcolatori L-A

Socket & RMI Ingegneria del Software - San Pietro

Parte II: Reti di calcolatori Lezione 12

Altri tipi di connessione

Programmazione distribuita in Java. Socket & Client-Server

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

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

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRGDWDJUDP

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

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Reti di Telecomunicazione Lezione 7

Applicazioni web. Parte 5 Socket

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

Corso di Reti di Calcolatori

Cenni di programmazione distribuita in C++ Mauro Piccolo

Programmare con le Socket TCP

Programmare con le Socket

Reti di Telecomunicazione Lezione 6

Corso sul linguaggio Java

Esercizi (1-2): da: TCP/IP Sockets in C (Donahoo-Calvert)

Transmission Control Protocol

Un flusso (stream) è una astrazione che produce e/o consuma informazioni.

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

Programmazione dei socket con TCP #2

INFORMATICA DISTRIBUITA. lez 4 Livello applicazione

appunti delle lezioni Architetture client/server: applicazioni client

Reti di Calcolatori:

Corso di Reti di Calcolatori. Datagrammi

Java threads (2) Programmazione Concorrente

Esercitazione. Formato di compitini e compiti: domande ed esercizi "closed book" G. Ferrari - Reti di calcolatori.

Il client deve stampare tutti gli eventuali errori che si possono verificare durante l esecuzione.

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Lezione 5: Socket SSL/ TLS. Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno

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

I/O su Socket TCP: read()

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

Telematica II 12. Esercitazione/Laboratorio 4

Corso di Reti di Calcolatori T

J+... J+3 J+2 J+1 K+1 K+2 K+3 K+...

I file di dati. Unità didattica D1 1

Applicazioni distribuite

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

Creare connessioni cifrate con stunnel

Telematica II 17. Esercitazione/Laboratorio 6

LABORATORIO DI INFORMATICA parte 6 -

appunti delle lezioni Architetture client/server: applicazioni server

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

I Socket. Laboratorio Software M. Grotto R. Farina

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

Sockets in Java. Lorenzo Gallucci

Protocolli applicativi: FTP

Progetto di RHS MicroAODV per Reti di Sensori A.A. 2007/2008

Reti di Telecomunicazione Lezione 8

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

Introduzione al Linguaggio C

R.Focardi Laboratorio di Ingegneria del Software 6. 1

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Introduzione. Java. G. Prencipe accesso alla rete -- TCP

RMI. Java RMI RMI. G. Prencipe

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

Architettura del. Sintesi dei livelli di rete. Livelli di trasporto e inferiori (Livelli 1-4)

Eclipse. Avviare un progetto e compilare un semplice programma

La sicurezza nel Web

MC-link Lan+ Connessione e configurazione del router PRESTIGE 100

Interprocess Communications - II. Franco Maria Nardini

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

20 - Input/Output su File

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

Controllo Winsock di Visual Basic

Lezione n.7 LPR- Informatica Applicata

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

INTERNET e RETI di CALCOLATORI A.A. 2011/2012 Capitolo 4 DHCP Dynamic Host Configuration Protocol Fausto Marcantoni fausto.marcantoni@unicam.

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Come funziona il WWW. Architettura client-server. Web: client-server. Il protocollo

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

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Networking. Mauro Migliardi Ph. D.

HTTP adaptation layer per generico protocollo di scambio dati

Client - Server. Client Web: il BROWSER

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

Corso di Informatica Modulo T3 B2 - Database in rete

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

LPR A 2005/2006 Lezione 5. Riepilogo Caratteristiche Datagram Socket Stream Mode Socket API Sockets Lato Client Sockets Lato Server Esempi

Server Sequenziale. Server Concorrente. Esercitazione: Socket Java con connessione

Dal protocollo IP ai livelli superiori

Reti di Calcolatori. Il Livello delle Applicazioni

Note pratiche sullo sviluppo di servlet (I)

Esercitazione [5] Input/Output su Socket

Corsi di Reti di Calcolatori (Docente Luca Becchetti) Esercizi su strati di trasporto e di rete

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Come leggere ed interpretare la letteratura scientifica e fornire al pubblico informazioni appropriate sui farmaci

Transcript:

Java Networking TCP 1

Sockets Java supporta un accesso semplificato e objectoriented alle sockets. Questo rende la network comunicazione di rete sensibilmente piu semplice. Molto piu semplice che in C++!! Vedremo che parlare ad un altra applicazione (locale o remota) puo essere semplice come leggere un file o ottenere un input da un utente. 2

Clients and Servers 3 Quando si scrivono network applications, e comune parlare di clients e servers. La distinzione e piuttosto vaga, ma sostanzialmente possiamo pensare che : chi inizia la conversazione e il client. chi accetta la richiesta di parlare e il server. Per I nostri scopi, la piu importante differenza tra client e server e che il client puo in qualunque istante creare una socket per iniziare una conversazione con una server application, mentre un server si deve preparare ad ascoltare in anticipo per possibili conversazioni in arrivo.

Sockets 4 La java.net.socket class rappresenta un singolo lato di una connessione socket indifferentemente su un client o su un server. Inoltre, il server usa la java.net.serversocket class per attendere connessioni da clients. Un applicazione agente come server crea un ServerSocket object e attende, bloccato in una chiamata al suo metodo accept(), finche non giunge una connessione. A quel punto, il metodo accept() create un Socket object che il server usa per comunicare con il client.

Sockets Un server mantiene molte conversazioni simultaneamente. C e una sola ServerSocket, ma una oggetto Socket attivo per ogni cliente. 5

Server port Un client ha bisogno di due informazioni per connettersi a un server su Internet: un nome di host (per recuperare l indirizzo del server) e un numero di porta (per individuare il processo sulla macchina server). Una applicazione server ascolta su una porta predefinita mentre attende una connessione. I clients selezionano il numero di porta corrispondente al servizio desiderato. I numeri di porta sono codificati nelle RFC (Es. Telnet 23, FTP 21, ecc.), ma possono anche essere scelti (quasi) arbitrariamente per applicazioni custom. 6

Client port Il numero di porta del client e tipicamente assegnato dal sistema operativo: la scelta di tale numero non e di solito rilevante. Quando una client socket mand un pacchetto a una server socket, il pacchetto include la specifica della porta e dell indirizzo del cliente: cosi il server e in grado di rispondere. 7

Sockets Usando le sockets, si deve decidere che tipo di protocollo si desidera per il trasporto di pacchetti sulla rete: Un protocollo connection-oriented o Un protocollo connectionless. 8

Connection-oriented protocols Un protocollo connection-oriented offre l equivalente di una conversazione telefonica. Dopo aver stabilito la connessione, due applicazioni possono scambiarsi dati. La connessione rimane in essere anche se nessuno parla. Il protocollo garantisce che non vengano persi dati e che questi arrivino sempre nell ordine corretto. 9 La classe Java Socket usa un protocollo connectionoriented, e parla TCP

Connectionless Protocols Un protocollo connectionless somiglia al servizio postale. Le applicazioni possono inviarsi brevi messaggi, ma non viene tenuta aperta una connessione tra un messaggio e l altro. Il protocollo NON garantisce che non vadano persi dati e che ne che questi arrivino nell ordine corretto. 10 La classe DatagramSocket usa un protocollo connectionless, e parla UDP

11 Connection oriented Protocols Con un connection-oriented protocol, una client socket stabilisce, alla sua creazione, una connessione con una server socket. Stabilita la connessione, un protocollo connection-oriented assicura la consegna affidabile dei dati, ovvero: 1. Ogni pacchetto spedito, il pacchetto viene consegnato. Ad ogni spedizione, la socket si aspetta di ricevere un acknowledgement cheil pacchetto e stato ricevuto con sucesso. Se la socket non riceve l acknowledgement entro un tempo prestabilito, la socket ri-invia il pacchetto. La socket continua a provare finche la trasmissione ha successo, o finche decide che la consegna e impossibile.

Connection oriented Protocols 2. I paccheti sono letti from dalla socket ricevente nello stesso ordine in cui sono stati spediti. Per il modo in cui la rete funziona, i pacchetti possono arrivare alla socket destinataria in un ordine diverso da quello in cui sono stati spediti. Un protocollo reliable, connection-oriented permette alla socket ricevente di riordinare i paccheti ricevuti, cosi che possano essere letti dal programma ricevente nell orine in cui erano stati spediti. 12

java.net.socket Questa classe implementa una socket per interprocess communication over the network. I constructor methods creano la socket e la connettono allo host e porta specificati. 13

java.net.socket Una volta creata la socket, getinputstream() e getoutputstream() ritornano oggetti InputStream e OutputStream che possono essere usati come se fossero canali di I/O su file. getinetaddress() e getport() restituicono indirizzo e porta a cui la socket e connessa. getlocalport() ritorna la porta locale usata dalla socket. 14

java.net.serversocket Questa classe e usata dai servers per ascoltare le richieste di connessione. Quando si crea una ServerSocket, si specifica su quale porta si ascolta. Il metodo accept() iniza ad ascoltare su quella porta, e si blocca finche un client non richiede una connessione su quella porta. 15 A quel punto, accept() accetta la connessione, creando e ritornando una Socket che il server puo usare per comunicare col client.

Sockets Clients Un applicazione client apre una connessione con un server costruendo una Socket che specifica hostname e port number del server desiderato: try { Socket sock = new Socket( www.pippo.it", 80); //Socket sock = new Socket("128.252.120.1", 80); } catch ( UnknownHostException e ) { System.out.println("Can't find host."); } catch ( IOException e ) { System.out.println("Error connecting to host."); } 16

Connection-oriented protocol 17 Il lato server di un protocollo connection-oriented tipicamente esegue questa sequenza: Crea un ServerSocket object per accettare connessioni. Quando il ServerSocket accetta la connection, crea un oggetto Socket che encapsula la connessione. Alla Socket viene chiesto di creare oggetti InputStream e OutputStream che leggono e scrivono bytes da e verso la connessione. La ServerSocket puo opzionalmente creare una nuova thread per ogni connessione, cosi che il server possa ascoltare per nuove connessioni mentre serve i clienti gia acquisiti.

Reading & Writing raw bytes Client side 18 Una volta stabilita la connessione, input e output streams possono essere ottenuti con i metodi getinputstream() e getoutputstream() di Socket. try { Socket server = new Socket("foo.bar.com", 1234); InputStream in = server.getinputstream(); OutputStream out = server.getoutputstream(); // Write a byte out.write(42); // Read a byte Byte back = in.read(); server.close(); } catch (IOException e ) { }

Reading & Writing newline delimited strings Client 19 Incapsulando InputStream & OutputStream e possibile accedere agli streams in modo piu semplice. try { Socket server = new Socket("foo.bar.com", 1234); InputStream in = server.getinputstream(); DataInputStream din = new DataInputStream( in ); OutputStream out = server.getoutputstream(); PrintStream pout = new PrintStream( out ); // Say "Hello" (send newline delimited string) pout.println("hello!"); // Read a newline delimited string String response = din.readline(); server.close(); } catch (IOException e ) { }

Reading & Writing raw bytes Server side try { ServerSocket listener = new ServerSocket( 1234 ); while (!finished ) { Socket aclient = listener.accept(); // wait for connection InputStream in = aclient.getinputstream(); OutputStream out = aclient.getoutputstream(); // Read a byte Byte importantbyte = in.read(); // Write a byte out.write(43); aclient.close(); } listener.close(); } catch (IOException e ) { } 20

Reading & Writing newline delimited strings Server 21 try { ServerSocket listener = new ServerSocket( 1234 ); while (!finished ) { Socket aclient = listener.accept(); // wait for connection InputStream in = aclient.getinputstream(); DataInputStream din = new DataInputStream( in ); OutputStream out = aclient.getoutputstream(); PrintStream pout = new PrintStream( out ); // Read a string String request = din.readline(); // Say "Goodbye" pout.println("goodbye!"); aclient.close(); } listener.close(); } catch (IOException e ) { }

This server is single-threaded Questo server e single-threaded Tratta una sola connessione alla volta; non chiama accept() per ascoltare nuove connessioni fin quando non ha finito con quella corrente. Un server piu realistico avrebbe un loop che accetta connessioni e le passa ad altre thread per servirle concorrentemente. 22

What about the Little Endian/Big Endian issue? Le classi Java DataInputStream and DataOutputStream lavorano con i bytes di tipi interi in network byte order (most significant to least significant). Percio non c e necessita di conversione dei dati! 23

Limitations Applets e altre applicazioni che girano sotto il controllo del SecurityManager possono avere restrizioni arbitrarie su quali hosts possono raggiungere, e sul fatto di poter accettare connessioni. La security policy standard imposta dai browsers premette alle applets di aprire socket solo con lo host da cui provengono. Le applets are hanno il permesso di aprire server sockets. 24

Limitations Ora, questo non significa che una applet non possa cooperare con il suo server per comunicare con chiunque e ovunque. Il server può girare un proxy che permette alla applet di comunicare indirettamente con chiunque. Questo pone l onere del controllo della sicurezza sul server originante, e non sulla macchina client. 25

Un mini-server concorrente HTTP Introduz. TinyHttpd ascolta su una port specificata and serve semplici richieste HTTP "get file : 26 GET /path/filename [optional stuff] Il Web browser manda una o piu di queste linee per ogni documento da ottenere. Letta la richiesta, il server prova ad aprire il file specificato e ne spedisce il contenuto. Se il documento contiene referenze ad immagini o altro da mostrare online, il browser continua con richieste GET addizionali. Per ragioni di performance, TinyHttpd serve ogni richiesta in una sua thread. Percio TinyHttpd puo servire molte richieste concorrentemente.

Un mini-server concorrente HTTP import java.net.*; import java.io.*; import java.util.*; public class TinyHttpd { public static void main( String argv[] ) throws IOException { ServerSocket ss = new ServerSocket(Integer.parseInt(argv[0])); while ( true ) new TinyHttpdConnection( ss.accept() ); } } 27

Un mini-server concorrente HTTP class TinyHttpdConnection extends Thread { Socket sock; TinyHttpdConnection ( Socket s ) { sock = s; setpriority( NORM_PRIORITY - 1 ); start(); } public void run() { try { OutputStream out = sock.getoutputstream(); DataInputStream d=new DataInputStream(sock.getInputStream()); String req = d.readline(); System.out.println( "Request: "+req ); StringTokenizer st = new StringTokenizer( req ); 28

Un mini-server concorrente HTTP 29 if ( (st.counttokens() >= 2) && st.nexttoken().equals("get") ) { if ( (req = st.nexttoken()).startswith("/") ) req = req.substring( 1 ); if ( req.endswith("/") req.equals("") ) req = req + "index.html"; try { FileInputStream fis = new FileInputStream ( req ); byte [] data = new byte [ fis.available() ]; fis.read( data ); out.write( data ); } catch ( FileNotFoundException e ) new PrintStream( out ).println("404 Not Found"); } else new PrintStream( out ).println( "400 Bad Request" ); sock.close(); } catch ( IOException e ) System.out.println( "I/O error " + e ); } }

Un mini-server concorrente HTTP - uso Compila TinyHttpd e mettilo nel tuo class path. Vai in una directory con qualche documento interessante e avvia il daemon, specificando un numero di porta non usato come argomento. Per esempio: % java TinyHttpd 1234 Ora dovrebbe essere possibile usare un Web browser standard per ottenere i files dal tuo host. Nella URL dovra essere specificato il numero di porta scelto. Per esempio, se il tuo hostname e venezia.sodalia.it, ed hai avviato il server come sopra, sara possibile ottenere il file welcome.html con: 30 http://venezia.sodalia,it:1234/welcome.html

Un mini-server concorrente HTTP - Note Abbassando la sua priorita a NORM_PRIORITY-1, assicuriamo che la threads che serve le connessioni gia stabilite non blocchi la main thread di TinyHttpd impedendole di accettare nuove richieste. 31

Un mini-server concorrente HTTP - Problemi 32 TinyHttpd ha un sacco di possibilita di miglioramento! Primo: consuma un sacco di memoria allocando un array enorme per leggere un intero the file tutto d un colpo. Un implementazione piu realistica userebbe un buffer ed invierebbe i dati in piu passei. TinyHttpd inoltre non riconosce semplici directories. Non sarebbe difficile aggiungere alcune lineee per leggere directories e generare liste di link HTML come fanno molti web server.

33 Un mini-server concorrente HTTP - Problemi TinyHttpd soffre di limitazioni imposte dalla debolezza di accesso al filesystem. E importante ricordare che le pathnames sono architecture dependent cosi come il concetto stesso di filesystem. TinyHttpd funziona, cosi com e, su systemi UNIX e DOS-like, ma richiede alcune variazioni su altre piattaforme. E possibile scrivere del codice piu elaborato code che usa environmental information offerte da Java per adattarsi al sistema locale.

Un mini-server concorrente HTTP - Problemi Il problema principale con TinyHttpd e che non ci sono restrizioni sui files a cui puo accedere. Con qualche trucco, il daemon spedirebbe un qualunque file del suo filesystem al client. Sarebbe utile rlimitare TinyHttpd ai files che sono nella directory corrente, or una sua subdirectory. 34

mini-server concorrente HTTP Security Manager import java.io.*; 35 class TinyHttpdSecurityManager extends SecurityManager { public void checkaccess(thread g) { }; public void checklisten(int port) { }; public void checklink(string lib) { }; public void checkpropertyaccess(string key) { }; public void checkaccept(string host, int port) { }; public void checkwrite(filedescriptor fd) { }; public void checkread(filedescriptor fd) { }; public void checkread( String s ) { if ( new File(s).isAbsolute() (s.indexof("..")!= -1) ) throw new SecurityException ("Access to file : "+s+" denied."); } }

mini-server concorrente HTTP Security Manager Il cuore di questo security manager e il metodo checkread(). Controlla due cose: assicura che il pathname non sia assoluto, e che il pathname non contenga un double dot (..) che risale l albero delle directories. Con questi vincoli siamo certi (almeno su un filesystem UNIX o DOS-like) di aver ristretto l accesso alle solo subdirectories della directory corrente. Se il pathname e absolute o contiene "..", checkread() lancia una SecurityException. 36

mini-server concorrente HTTP Security Manager 37 Gli altri metodi che non fanno nulla --e.g., checkaccess() permettono al daemon di fare il suo lavoro senza interferenza da paret del security manager. Quando installiamo un security manager, ereditiamo implementazioni di molte "check" routines. L implementazione default non permette di fare nulla; Lancia una security exception appena chiamata. Dobbiamo aprire dei buchi cosicche il daemon possa fare il suo lavoro; deve accettare connections, ascoltare sockets, creare threads, leggere property lists, ecc. Per questo sovrascriviamo i metodi default.

mini-server concorrente HTTP Security Manager Per installare il security manager, aggiungere la seguente riga all inizio del main di TinyHttpd: System.setSecurityManager( new TinyHttpdSecurityManager() ); Per catturare le security exception, aggiungere il seguente catch dopo la catch di FileNotFoundException': catch ( SecurityException e ) new PrintStream( out ).println( "403 Forbidden" ); 38

A simple e-mail client import java.net.*; import java.io.*; import java.util.*; class EMailClient{ public static void main(string[] args){ new EmailClient() } // end main EMailClient() { String server = "put your email server name here"; int port = 25; //mail port try{ //Get a socket, connected to the specified server // on the specified port. Socket socket = new Socket(server,port); 39

A simple e-mail client 40 //Get an input stream from the socket BufferedReader inputstream = new BufferedReader(new InputStreamReader( socket.getinputstream())); //Get an output stream to the socket. Note // that this stream will autoflush. PrintWriter outputstream = new PrintWriter(new OutputStreamWriter( socket.getoutputstream()),true); //Begin the conversation with the email server. outputstream.println( "mail from: put your email name here"); System.out.println(inputStream.readLine()); outputstream.println( "rcpt to: " + "put your email name here"); System.out.println(inputStream.readLine()); outputstream.println("data"); System.out.println(inputStream.readLine());

A simple e-mail client String timestamp = (new Date()).toString(); outputstream.println("test message " + timestamp); outputstream.println("."); System.out.println(inputStream.readLine()); //Close the socket socket.close(); }//end try catch(unknownhostexception e){ System.out.println(e); System.out.println( "Must be online to run properly."); }//end catch UnknownHostException catch(ioexception e){system.out.println(e);} }//end constructor }//end class 41