LEZIONE N.5 LPR INFORMATICA APPLICATA CONNECTION ORIENTED SOCKETS (2)

Documenti analoghi
Lezione n.7 LPR Informatica Applicata Il Protocollo TCP Stream Socket. 20/04/2009 Laura Ricci

Lezione n.6. TCP: Stream Sockets. 10/11/2009 Vincenzo Gervasi

Programmazione distribuita in Java. Socket & Client-Server

Lezione n.3 LPR - Informatica Applicata

Sockets in Java. Lorenzo Gallucci

Lezione n.5 LPR Informatica Applicata JAVA Socket TCP: Interazione con il Supporto

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

Lezione n.6 LPR Informatica Applicata Serializzazione JAVA

Lezione n.7 LPR -Informatica applicata Socket e Datagram UDP. 11/4/2013 Laura Ricci

Architettura Client-Server

Lezione n.4 LPR INFORMATICA APPLICATA CONNECTION ORIENTED SOCKETS

Applicazioni web. Parte 10 Socket. Alberto Ferrari

domenica 9 giugno 13 Serializzazione

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

INPUT OUTPUT Programmazione in rete e laboratorio. Le operazioni di I/O avvengono attraverso stream (sequenze di byte)

Multithreading. Multithreading/2

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

Esercitazione: Socket Java senza connessione

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

Socket in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A lezione 17 -

Parte II: Reti di calcolatori Lezione 10

ALTRI TIPI DI CONNESSIONE

Corso di Reti di Calcolatori

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

Corso di Reti di Calcolatori L-A

Esercizio Trasferimento File e Multicast

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

LPR A 2005/2006 Lezione 4

Parte II: Reti di calcolatori Lezione 12

GESTIONE DEGLI ERRORI

Modello client-server

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

R.Focardi Laboratorio di Ingegneria del Software 6. 1

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Java e Serializzazione dalla A all'xml di Leonardo Puleggi

Corso di Telematica II

20/12/2010. Package java.net (Socket ServerSocket) Package java.rmi (uso di oggetti remoti)

Programmazione in Rete

Organizzazione della lezione. Lezione 10 Interprocess Communication in Java. Gli obiettivi del middleware. Middleware

La Serializzazione in Java. L24_Serialization 1

Creazione, eliminazione, lettura e scrittura di file di testo

Programmazione di rete in Java

Laboratorio di reti I

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

JAVA E LA RETE IL CONCETTO DI SOCKET. RETI DI CALCOLATORI Linguaggio Java: La Programmazione di Rete. già pronta!! COMUNICAZIONE VIA SOCKET CORSO DI

Corso sul linguaggio Java

Programmare con le Socket

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Programmazione di rete

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

Programmazione a oggetti

Unità 2 I file binari

L input da tastiera in Java. Dott. Ing. M. Banci, PhD

Programmare con le Socket TCP

Il Linguaggio Java: Socket.

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRGDWDJUDP

MagiCum S.r.l. Progetto Inno-School

ASD: Sistemi Distribuiti (Prof. Scarano) 07/05/2002

RMI. Java RMI RMI. G. Prencipe

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Eccezioni Precisazioni e approfondimenti

ESERCIZIO 1 (FILE DI TESTO)

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Lezione 16 programmazione in Java

Comunicazione tra processi con sockets TCP

Il modello client/server consente a due processi di condividere risorse e di cooperare per il raggiungimento di un obiettivo.

TFA 42 Sistemi e Reti di Calcolatori per la Didattica

Protocolli Internet. Canale di comunicazione. canale di comunicazione

Capitolo 2: Livello di applicazione

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Reti di Calcolatori:

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

Il linguaggio Java I file sequenziali

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

Gestione delle eccezioni

Soluzione dell esercizio 2 (TCP) dell esame del 16 giugno 2015

Le eccezioni in Java

Altri tipi di connessione

Gestione delle eccezioni in Java

Informatica I. Ingegneria Medica. Prof. Diego Salamon

Riferimenti ad oggetti: Fondamenti di Informatica L-B Esercitazione n 4 Java: I/O, Costruttori e altro. Riferimenti ad oggetti: (Esempio)

PROGRAMMARE IN JAVA VOLUME II

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

RTTI Run-time type identification

Lo strato di applicazione in Internet

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

Cifratura simmetrica

Fondamenti di Informatica C Esercitazioni di Laboratorio / 4 Outline

Corso di Reti di Calcolatori

Esempio su strutture dati dinamiche: ArrayList

Corso di Reti di Calcolatori. Datagrammi

Algoritmi di Ricerca. Esempi di programmi Java

Prova d Esame Compito A

Introduzione Programmazione Java

Flussi, lettori e scrittori

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2012

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

Transcript:

LEZIONE N.5 LPR INFORMATICA APPLICATA CONNECTION ORIENTED SOCKETS (2) 17/03/2008 Laura Ricci Laura Ricci 1

STREAM MODE SOCKET API: INTEZIONE CON SERVERS PREDEFINITI Esercizio: considerare un servizio attivo su una porta pubblicata da un Server. Definire un client JAVA che utilizzi tale servizio. Il linguaggio con cui è scritto il client è indipendendente da quello con cui è scritto il server. Si possono considerare i seguenti semplici servizi (vedere JAVA Network Programming) Daytime(porta 13): il client richiede una connessione sulla porta 13, ma non invia alcun dato al server. Il server invia la data odierna e l'ora come una stringa di caratteri e quindi chiude la connessione. Echo (port 7): il client apre una connesione sulla porta 7 del server ed invia un messaggio. Il server restituisce il messaggio al client. Utilizzato per testare e misurare lo stato della rete Laura Ricci 2

STREAM MODE SOCKET API: INTEZIONE CON SERVERS PREDEFINITI Finger (porta 79): il client si connette ad un server specificando un username oppure un indirizzo di posta. Il server restituisce informazioni su un utente specificato dal client (es:mail, n.telefono,n.stanza, etc.) % finger ricci@di.unipi.it Whois (porta 43): il client invia un'interrogazione per a quale provider Internet appartenga un determinato indirizzo IP o uno specifico DNS Altri servizi noti: 22 SSH 25 SMTP 80 HTTP Laura Ricci 3

ECHO CLIENT TCP Il client esegue iterativamente le seguenti operazioni richiede una stringa in input ne attende l'echo dal server fino a quando viene inserita la stringa 'exit', nel qual caso chiude la comunicazione e termina Laura Ricci 4

ECHO CLIENT TCP import java.net.*; import java.io.*; import java.util.*; public class EchoClient { public static void main (String args[ ]) throws Exception { Scanner console = new Scanner( System.in); InetAddress ia=inetaddress.getbyname("localhost"); int port=7; Socket echosocket=null; try{ echosocket = new Socket (ia, port);} catch (Exception e){system.out.println(e);return;} InputStream is = echosocket.getinputstream( ); DataInputStream NetworkIn = new DataInputStream(is); OutputStream os=echosocket.getoutputstream(); DataOutputStream NetworkOut = new DataOutputStream(os); Laura Ricci 5

ECHO CLIENT TCP boolean done=false; while (! done) {String linea = console.nextline( ); System.out.println (linea); if (linea.equals("exit")) {NetworkOut.writeUTF(linea); NetworkOut.flush( ); done = true; echosocket.close ( ); } else {NetworkOut.writeUTF (linea); NetworkOut.flush( ); String echo=networkin.readutf( ); System.out.println (echo); } } } } Laura Ricci 6

ECHO SERVER TCP Echo Server si mette in attesa di richieste di connessione dopo aver accettato una connessione, si mette in attesa di una stringa dal client e gliela rispedisce quando riceve la stringa exit chiude la connessione con quel client e torna ad accettare nuove connessioni Laura Ricci 7

ECHO SERVER TCP import java.net.*; import java.io.*; public class EchoServer { public static void main (String args[ ]) throws Exception{ int port=...; ServerSocket ss= new ServerSocket(port); Laura Ricci 8

ECHO SERVER TCP while (true) {Socket sdati = ss.accept( ); InputStream is = sdati.getinputstream( ); DataInputStream networkin = new DataInputStream(is); OutputStream out=sdati.getoutputstream( ); DataOutputStream networkout = new DataOutputStream(out); boolean done=false; while (!done){ String echo= networkin.readutf( ); if (echo.equals("exit")) {System.out.println("finito"); done=true;} else {networkout.writeutf(echo);} } } } } Laura Ricci 9

SOCKETS LATO CLIENT: CHIUSURA Un socket (oggetto della classe Socket) viene chiuso automaticamente a causa di: garbage collection terminazione del programma chiusura di uno degli streams associati In certi casi (esempio un web browser) il numero di sockets aperti può essere molto alto il numero massimo di sockets supportati può essere raggiunto prima della garbage collection può essere necessario chiudere esplicitamente alcuni sockets che non vengono più utilizzati chiusura esplicita di un socket s : s.close( ) Laura Ricci 10

CHIUSURA DI SOCKETS for (int i = 1; i< 1024; i++) {try { s = new Socket(host, i); System.out.println("Esiste un servizio sulla porta"+i); } catch (UnknownHostException ex) {System.out.println("Host Sconosciuto"); break;} catch (IOException ex) {System.out.println("Non esiste un servizio sulla porta"+i);} finally{ // la clausola finally viene eseguita dopo il blocco try...catch, try{ // qualunque sia il modo con cui si è usciti da tale blocco if (s!=null) {s.close( ); s=null; System.out.println("chiuso");} } catch(ioexception ex){ }; } } Laura Ricci 11

INVIO DI OGGETTI SU CONNESSIONI TCP Per inviare oggetti su una connessione TCP occorre definire l'oggetto come istanza di una classe che implementa l'interfaccia Serializable E' possibile associare i filtri ObjectInputStream/ ObjectOutputStream agli stream di bytes associati al socket e restituiti da getinputstream/getoutputstream Quando creo un ObjectOutputstream viene scritto lo stream header sullo stream. In seguito scrivo gli oggetti che voglio inviare sullo stream L'header viene scritto una sola volta quando lo stream viene creato e viene letto alla prima lettura sullo stream L'invio/ ricezioni degli oggetti sullo/dallo stream avviene mediante scritture/letture sullo stream (writeobject, readobject) Laura Ricci 12

INVIO DI OGGETTI SU UNA CONNESSIONE TCP import java.io.*; public class Studente implements Serializable { private int matricola; private String nome, cognome, corsodilaurea; public Studente (int matricola, String nome, String cognome, String corsodilaurea) { this.matricola = matricola; this.nome = nome; this.cognome = cognome; this.corsodilaurea = corsodilaurea;} public int getmatricola () { return matricola; } public String getnome () { return nome; } public String getcognome () { return cognome; } public String getcorsodilaurea () { return corsodilaurea; } } Laura Ricci 13

INVIO DI OGGETTI SU UNA CONNESSIONE TCP- LATO SERVER import java.io.*; import java.net.*; public class Server { public static void main (String args[]) { try { ServerSocket server = new ServerSocket (3575); Socket clientsocket = server.accept(); ObjectOutputStream output = new ObjectOutputStream (clientsocket.getoutputstream ()); output.writeobject("<welcome>"); Studente studente = new Studente (14520,"Mario","Rosso","Informatica"); output.writeobject(studente); output.writeobject("<goodbye>"); clientsocket.close(); server.close(); } catch (Exception e) { System.err.println (e); } } } Laura Ricci 14

INVIO DI OGGETTI SU UNA CONNESSIONE TCP-LATO CLIENT import java.io.*; import java.net.*; public class Client { public static void main (String args[ ]) { try { Socket socket = new Socket ("localhost",3575); ObjectInputStream input = new ObjectInputStream (socket.getinputstream ()); String beginmessage = (String) input.readobject(); System.out.print (studente.getmatricola()+" - "); System.out.print (studente.getnome()+" "+studente.getcognome()+" - "); System.out.print (studente.getcorsodilaurea()+"\n"); String endmessage = (String)input.readObject(); System.out.println (endmessage); socket.close();} catch (Exception e) { System.out.println (e); } } } Laura Ricci 15

INVIO DI OGGETTI SU UNA CONNESSIONE TCP- LATO CLIENT Stampa prodotta lato Client <Welcome> 14520 - Mario Rossi - Informatica <Goodbye> Laura Ricci 16

CLASSE SOCKET: OPZIONI la classe socket offre la possibilità di impostare diverse proprietà (opzioni) ogni opzione consente di controllare il modo con cui i dati vengono scabiati attraverso il socket Opzioni SO_TIMEOUT SO_LINGER SO_KEEPALIVE SO_RCVBUF SO_SNDBUF TCP_NODELAY... Laura Ricci 17

CLASSE SOCKET: SO_TIMEOUT SO_TIMEOUT consente di associare un time out al socket if (s.getsotimeout( )== 0) s.setsotimeout(1800000); Quando eseguo una lettura da uno stream socket, l'operazione si blocca fino al momento in cui ci sono byte sufficienti per restituire il dato richiesto SO_TIMEOUT: definisce un intervallo di tempo massimo per l'attesa dei dati Laura Ricci 18

CLASSE SOCKET: SO_LINGER La proprietà SO_LINGER (LINGER = indugiare,soffermarsi) viene utilizzata per specificare cosa accade quando viene invocato il metodo close( ) su un socket TCP A seconda del valore di SO_LINGER può accadere che Linger= false (default): il contenuto del buffer di invio associato al socket viene inviato al destinatario, mentre i dati nel buffer di ricezione vengono scartati. Il metodo close( ) non attende la terminazione di queste attività che avvengono quindi in background. Questo è lo scenario di default, che però non garantisce che i dati vengano consegnati correttamente. In caso di crash del destinatario, ad esempio, i dati nel buffer di spedizione non vengono consegnati Laura Ricci 19

CLASSE SOCKET: SO_LINGER Linger=true, Linger time=0 Vengono scartati sia gli eventuali dati nel buffer di ricezione che quelli da inviare. Come prima, lo scarto avviene in background Utilizzato quando si vuole terminare la connessione immediatamente, senza spedire i dati Linger=true e linger time!=0 Vengono inviati eventuali dati presenti nel buffer al destinatario e si scartano gli eventuali dati nel buffer di ricezione. Il metodo close( ) si blocca per il linger time oppure fino a che tutti i dati spediti sono stati confermati a livello TCP. Dopo linger time viene sollevata un'eccezione Quando si vuole garantire che il metodo close() ritorni solo quando i dati sono stati consegnati, oppure che sollevi un'eccezione nel caso in cui scatti il time-out definito da linger-time Laura Ricci 20

CLASSE SOCKET:SO_LINGER public void setsolinger (boolean no, int seconds) public int getsolinger ( ) throws SocketException throws SocketException per default, SO_LINGER=false: il supporto tenta di inviare i datagrams rimanenti, anche dopo che il socket è stato chiuso per controllare la gestione dei datagrams presenti al momento della chiusura if (s.getsolinger( )== -1) s.setsolinger(true,240); il metodo close( ) si blocca ed attende 240 secondi (4 minuti) prima di eliminare i datagrams rimanenti. Se il tempo di attesa viene impostato a 0, i datagram vengono eliminati immediatamente. Laura Ricci 21

CLASSE SOCKET: SO_KEEPALIVE So_keepalive: introdotto per individuare i sockets idle su cui non sono stati inviati dati per un lungo intervallo di tempo Per default, su ogni socket vengono spediti solo dati inviati dalla applicazione Un socket può rimanere inattivo per ore, o anche per giorni Esempio: crash di un client prima dell'invio di un segnale di fine sequenza. In questo caso, il server può sprecare risorse (tempo di CPU, memoria,...) per un client che ha subito un crash somesocket.setsokeepalive(true) abilita il keep alive. Il supporto invia periodicamente dei messaggi di keep alive sul socket per testare lo stato del partner. Se il partner non risponde, il socket viene chiuso automaticamente alternativa all'uso di time-out associati al socket Laura Ricci 22

CLASSE SOCKET: SO_RCVBUF, SO_SNDBUF SO_RCVBUF Controlla la dimensione del buffer utilizzato per ricevere i dati. E' possibile impostare la dimensione del buffer di ricezione Socket.setReceiveBufferSize(4096) La modifica non viene garantita su tutti i sistemi operativi Per reperire la dimensione del buffer associato int size = sock. getreceivebuffersize( ) Alternativa: utilizzare i BufferedInputStream/BufferedReader. SO_SNDBUF : analogo per il buffer associato alla spedizione int size = sock.getsendbuffersize( ); Laura Ricci 23

CLASSE SOCKET: TCP_NODELAY Algoritmo di Nagle: riduce il numero di pacchetti spediti sulla rete fondendo in un unico pacchetto più dati può interagire in modo scorretto con il meccanismo dei delayed ack Il TCP_NODELAY controlla l'uso dell'algoritmo di bufferizzazione di Nagle sock.settcpnodelay(false) disabilita/abilita la bufferizzazione Alcuni sistemi operativi disabilitano l'algoritmo di Nagle di default Laura Ricci 24

ESERCIZIO Sviluppare un'applicazione che offra il servizio di trasferimento di RemoteCopyClient ad un server RemoteCopyServer. Il client richiede, in modo interattivo, il nome del file da trasferire all utente, e, se il file esiste, richiede una connessione al Server. Quando la connessione viene accettata, invia al server il nome del file seguito dal suo contenuto. Infine il client attende l esito della operazione dal server, quindi torna a proporre una nuova richiesta di trasferimento all utente. RemoteCopyServer riceve una richiesta di connessione e salva il file richiesto in una directory locale. Alla fine del download del file, RemoteCopyServer invia al client l esito della operazione. L esito può essere di due tipi: update: il file esisteva già ed è stato sovrascritto new: è stato creato un nuovo file Laura Ricci 25