Esercitazione: Socket Java senza connessione

Похожие документы
Il modello client/server consente a due processi di condividere risorse e di cooperare per il raggiungimento di un obiettivo.

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

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Corso di Reti di Calcolatori

Corso di Reti di Calcolatori. Datagrammi

Esercizi su UDP. Esercitazione di Laboratorio di Programmazione di Rete A. Daniele Sgandurra 22/10/2008. Università di Pisa

Programmazione distribuita in Java. Socket & Client-Server

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Corso di Reti di Calcolatori L-A

Protocolli Internet. Canale di comunicazione. canale di comunicazione

Esercizio Trasferimento File e Multicast

Applicazioni web. Parte 5 Socket

Modello client-server

Laboratorio di reti I: Il pacchetto java.net

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

Telematica II 12. Esercitazione/Laboratorio 4

Tecniche di programmazione concorrente e distribuita

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

Programmare con le Socket TCP

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

Reti di Calcolatori:

Programmare con le Socket

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

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

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Architettura Client-Server

ESERCITAZIONI DI LABORATORIO 1

PROGRAMMARE IN JAVA VOLUME II

Introduzione ai (Java) socket

GESTIONE DEGLI ERRORI

I name server DNS. DNS: Domain Name System. Esempio di DNS. DNS: Root name server. DNS: queries ripetute

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

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

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

Networking. Mauro Migliardi Ph. D.

DNS: Domain Name System

Gestione delle Eccezioni

R.Focardi Laboratorio di Ingegneria del Software 6. 1

Corso di Telematica II

Java Socket LSO 2008

Corso sul linguaggio Java

Il Linguaggio Java: Socket.

Sockets in Java. Lorenzo Gallucci

Cifratura simmetrica

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

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

Esempio su strutture dati dinamiche: ArrayList

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

DNS: Domain Name System

Lezione n.2 20/2/2006

Parte II: Reti di calcolatori Lezione 10

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

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

Java e Serializzazione dalla A all'xml di Leonardo Puleggi

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

TFA 42 Sistemi e Reti di Calcolatori per la Didattica

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

Programmazione a oggetti

Транскрипт:

Esercitazione: Socket Java senza connessione Client e Server Datagram Sviluppare un applicazione C/S in cui: il client invia al server pacchetti contenenti il nome del file e il numero della linea del file che vuole ricevere, che sono richiesti dall utente usando l input da console. Si stampa il contenuto del pacchetto ottenuto in risposta, che può essere la linea richiesta o una risposta negativa. Per evitare che, in caso di caduta del server o perdita di un pacchetto, il client si blocchi indefinitamente nell attesa della risposta è previsto un timeout di 30 s; il server verifica l esistenza del file richiesto. Se il file non esiste notifica l errore, altrimenti tenta di estrarre la linea richiesta. Se la linea non esiste invia una notifica di errore. Altrimenti invia al client (o ai client) un pacchetto contenente la linea richiesta. Dopo 3 minuti senza ricezione di richieste il server termina. client client rete server client pkt2 line2 pkt3 line1 pkt1 pkt3 pkt2 pkt1 line1 line2 line3 line3 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 1 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 2

La Classe DatagramPacket Classe con cui vengono rappresentati i pacchetti UDP da inviare e ricevere sulle socket di tipo Datagram. Si costruisce un datagram packet specificando: il contenuto del messaggio (i primi ilength bytes dell array ibuf) l indirizzo IP del destinatario il numero di porta su cui il destinatario è in ascolto public DatagramPacket(byte ibuf[], int ilength, InetAddress iaddr, int iport) Se il pacchetto deve essere ricevuto basta definire il contenuto: public DatagramPacket(byte ibuf[], int ilength) La classe mette a disposizione una serie di metodi per estrarre o settare le informazioni: getaddress(), setaddress(inetaddress addr) getport(), setport(int port) getdata(), setdata(byte[] buf), etc. La Classe InetAddress Classe con cui vengono rappresentati gli indirizzi Internet, astraendo dal modo con cui vengono specificati (a numeri o a lettere) Portabilità e trasparenza No costruttori, utilizzo di tre metodi statici: public static InetAddress getbyname(string hostname); restituisce un oggetto InetAddress rappresentante l host specificato (come nome o indirizzo numerico); con il parametro null ci si riferisce all indirizzo di default della macchina locale public static InetAddress[] getallbyname(string hostname); restituisce un array di oggetti InetAddress; utile in casi di più indirizzi IP registrati con lo stesso nome logico public static InetAddress getlocalhost(); restituisce un oggetto InetAddress corrispondente alla macchina locale; se tale macchina non è registrata oppure è protetta da un firewall, l indirizzo è quello di loopback: 127.0.0.1 Tutti possono sollevare l eccezione UnknownHostException se l indirizzo specificato non può essere risolto (tramite il DNS) Applicazioni Distribuite e Servizi di Rete Socket Datagram - 3 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 4

Schema di soluzione: il Client 1. Creazione socket ed eventuale settaggio opzioni: socket = new DatagramSocket(); socket.setxxx( ); 2. Interazione da console con l utente: BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Domanda "); String richiesta = stdin.readline(); 3. Creazione del pacchetto di richiesta con le informazioni inserite dall utente: packetout = DatagramUtility.buildPacket (addr, LineServer.PORT, richiesta); 4. Invio del pacchetto al server: socket.send(packetout); 5. Attesa del pacchetto di risposta: packetin = new DatagramPacket (buf, buf.length); socket.receive(packetin); 6. Estrazione delle informazioni dal pacchetto ricevuto: risposta = DatagramUtility.getContent(packetIN); Schema di soluzione: il Server 1. Creazione socket: socket = new DatagramSocket(PORT); 2. Attesa del pacchetto di richiesta: packet = new DatagramPacket (buf, buf.length); socket.receive(packet); 3. Estrazione delle informazioni dal pacchetto ricevuto: String richiesta = DatagramUtility.getContent(packet); StringTokenizer st = new StringTokenizer(richiesta); nomefile = st.nexttoken(); numlinea = Integer.parseInt(st.nextToken()); 4. Creazione del pacchetto di risposta con la linea richiesta: String linea = LineUtility.getLine(nomeFile, numlinea); packet = DatagramUtility.buildPacket( mittaddr, mittport, linea); 5. Invio del pacchetto al client: socket.send(packet); Applicazioni Distribuite e Servizi di Rete Socket Datagram - 5 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 6

Datagram Utility public class DatagramUtility { Metodo per creare un pacchetto da una stringa: static protected DatagramPacket buildpacket (InetAddress addr, int port, String msg) throws IOException{ ByteArrayOutputStream bostream = new ByteArrayOutputStream(); DataOutputStream dostream = new DataOutputStream(boStream); dostream.writeutf(msg); byte[] data = bostream.tobytearray(); return new DatagramPacket(data, data.length, addr, port); Metodo per recuperare una stringa da un pacchetto: static protected String getcontent (DatagramPacket dp) throws IOException{ ByteArrayInputStream bistream = new ByteArrayInputStream(dp.getData(), 0, dp.getlength()); DataInputStream distream = new DataInputStream(biStream); String msg = distream.readutf(); return msg; Applicazioni Distribuite e Servizi di Rete Socket Datagram - 7 LineUtility public class LineUtility { Metodo per recuperare una certa linea di un certo file: static String getline (String nomefile, int numlinea) { String linea = null; BufferedReader in = null; in = new BufferedReader( new FileReader(nomeFile)); catch (FileNotFoundException e) { return linea = "File non trovato"; for (int i=1; i<numlinea; i++) in.readline(); if ((linea = in.readline()) == null) linea = "Linea non trovata"; catch (IOException e) { return linea = "Linea non trovata"; return linea; Applicazioni Distribuite e Servizi di Rete Socket Datagram - 8

Metodo per recuperare la linea successiva di un file già aperto in precedenza: static String getnextline(bufferedreader in) { String linea = null; Line Client public class LineClient { public static void main(string[] args) { if ((linea = in.readline()) == null) { in.close(); linea = "Nessuna linea disponibile"; catch (FileNotFoundException e) { return linea = "File non trovato"; catch (IOException e) { linea = "Nessuna linea disponibile"; return linea; DatagramSocket socket=null; socket = new DatagramSocket(); socket.setsotimeout(30000); catch (SocketException e) { System.exit(1); InetAddress addr=null; if (args.length == 0) addr = InetAddress.getByName(null); else addr = InetAddress.getByName(args[0]); catch(unknownhostexception e){ System.exit(2); BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); String richiesta=null; Applicazioni Distribuite e Servizi di Rete Socket Datagram - 9 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 10

System.out.print("\n^D(Unix)/^Z(Win)+invio per uscire, solo invio per continuare: "); while (stdin.readline()!=null){ System.out.print("Nome del file? "); String nomefile = stdin.readline(); System.out.print("Numero linea? "); int numlinea = Integer.parseInt(stdIn.readLine()); richiesta = nomefile+" "+numlinea; catch (Exception e) { System.out.print("\n^D(Unix)/^Z(Win) +invio per uscire, solo invio per continuare: "); continue; DatagramPacket packetout = DatagramUtility.buildPacket (addr, LineServer.PORT, richiesta); socket.send(packetout); catch (IOException e){/* come sopra */ DatagramPacket packetin=null; byte[] buf = new byte[256]; packetin = new DatagramPacket(buf, buf.length); socket.receive(packetin); catch (IOException e){/* come sopra */ String risposta=null; risposta = DatagramUtility.getContent(packetIN); System.out.println("Risposta: " + risposta); catch (IOException e){/* come sopra */ System.out.print("\n^D(Unix)/^Z(Win)+invio per uscire, solo invio per continuare: "); // while catch(exception e){ System.out.println("LineClient: termino.."); socket.close(); Applicazioni Distribuite e Servizi di Rete Socket Datagram - 11 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 12

Line Server public class LineServer { public static final int PORT = 4445; public static void main(string[] args) { DatagramSocket socket = null; socket = new DatagramSocket(PORT); catch (SocketException e) { System.exit(1); while (true) { System.out.println("\n In attesa di richieste..."); DatagramPacket packet=null; InetAddress mittaddr=null; int mittport=0; byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet); mittaddr = packet.getaddress(); mittport = packet.getport(); Applicazioni Distribuite e Servizi di Rete Socket Datagram - 13 catch(ioexception e){ e.getmessage()); continue; String nomefile; int numlinea; String richiesta = DatagramUtility.getContent(packet); StringTokenizer st = new StringTokenizer(richiesta); nomefile = st.nexttoken(); numlinea = Integer.parseInt(st.nextToken()); catch(exception e){/* come sopra */ String linea = LineUtility.getLine(nomeFile, numlinea); packet = DatagramUtility.buildPacket( mittaddr, mittport, linea); socket.send(packet); catch(ioexception e){/* come sopra */ // while catch(exception e){ System.out.println("LineServer: termino.."); socket.close(); Applicazioni Distribuite e Servizi di Rete Socket Datagram - 14

Socket multicast Modificare il programma sviluppato nella prima parte dell esercitazione in modo che: i client non inviino più nessun pacchetto di richiesta al server ma si associno al gruppo cui il server invia periodicamente le linee di un certo file, ne ricevano alcune (per es. 5), le stampino, poi si dissocino dal gruppo il server invii periodicamente (per es. ogni 5 secondi), una linea di un certo file ad un prefissato indirizzo multicast (230.0.0.1). Terminato il file, il server interrompa gli invii notificando l interruzione del servizio mediante l invio di un messaggio di congedo Schema di soluzione: il Client Multicast 1. Creazione socket ed eventuale settaggio opzioni: socket = new MulticastSocket(MulticastServer.PORT); socket.setxxx( ); 2. Adesione al gruppo multicast: address = InetAddress.getByName("230.0.0.1"); socket.joingroup(address); 3. Attesa del pacchetto di risposta: packet = new DatagramPacket (buf, buf.length); socket.receive(packet); client join join server 4. Estrazione delle informazioni dal pacchetto ricevuto: line join rete line risposta = DatagramUtility.getContent(packet); client client line join line line Indirizzo Multicast 5. Uscita dal gruppo multicast socket.leavegroup(address); Applicazioni Distribuite e Servizi di Rete Socket Datagram - 15 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 16

Schema di soluzione: il Server Multicast 1. Creazione socket: socket = new DatagramSocket(PORT); 2. Creazione del gruppo: group = InetAddress.getByName("230.0.0.1"); 3. Creazione del pacchetto da inviare: String linea = LineUtility.getNextLine(in); DatagramPacket packet = DatagramUtility.buildPacket (group, PORT, linea); 4. Invio del pacchetto a tutto il gruppo: socket.send(packet); Line Multicast Client public class MulticastClient { public static void main(string[] args) { MulticastSocket socket=null; socket = new MulticastSocket(MulticastServer.PORT); socket.setsotimeout(20000); catch (IOException e) { System.exit(1); InetAddress address=null; address = InetAddress.getByName("230.0.0.1"); socket.joingroup(address); catch (IOException e) {/* come sopra */ DatagramPacket packet; for (int i = 0; i < 5; i++) { Applicazioni Distribuite e Servizi di Rete Socket Datagram - 17 System.out.println("\n In attesa di un datagramma... "); byte[] buf = new byte[256]; packet = new DatagramPacket(buf, buf.length); socket.receive(packet); Applicazioni Distribuite e Servizi di Rete Socket Datagram - 18

//for catch (IOException e) { continue; String linea=null; linea = DatagramUtility.getContent(packet); System.out.println( "Linea ricevuta: " + linea); catch (IOException e) {/* come sopra*/ System.out.println("\nUscita dal gruppo"); socket.leavegroup(address); catch (IOException e) { System.out.println("MulticastClient: termino"); socket.close(); Line Multicast Server public class MulticastServer { public static final int PORT = 4446; public static final String FILE = "saggezza.txt"; static BufferedReader in = null; static boolean morelines = true; public static void main(string[] args) { long WAIT = 1000; int count=0; DatagramSocket socket = null; socket = new DatagramSocket(PORT); System.out.println("Socket: " + socket); catch (SocketException e) { System.exit(1); // associazione di uno stream di input al file da cui estrarre le linee in = new BufferedReader( new FileReader(FILE)); System.out.println("File "+FILE+ " aperto"); catch (FileNotFoundException e) { /* come sopra */ Applicazioni Distribuite e Servizi di Rete Socket Datagram - 19 Applicazioni Distribuite e Servizi di Rete Socket Datagram - 20

// creazione del gruppo InetAddress group=null; group = InetAddress.getByName("230.0.0.1"); catch (UnknownHostException e) { /* come sopra */ while (morelines) { count++; byte[] buf = new byte[256]; String linea = LineUtility.getNextLine(in); DatagramPacket packet = DatagramUtility.buildPacket( group, PORT, linea); socket.send(packet); catch (Exception e) { continue; Thread.sleep((long)(Math.random()*WAIT)); catch (InterruptedException e) { // while System.out.println("File terminato"); System.out.println("MulticastServer: termino "); socket.close(); NOTA: Il server usa una DatagramSocket per fare il broadcasting del pacchetto anziché usare una MulticastSocket. L importante è che siano multicast l indirizzo del pacchetto e la socket usata dal client per riceverlo. Applicazioni Distribuite e Servizi di Rete Socket Datagram - 21