Corso di Reti di Calcolatori T

Documenti analoghi
Principi, Modelli e Applicazioni per Sistemi Distribuiti M

Esercitazione: Socket Java senza connessione

Server Sequenziale. Server Concorrente. Socket Java con connessione. Materiale addizionale per esercitazioni facoltative

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRGDWDJUDP

Principi, Modelli e Applicazioni per Sistemi Distribuiti M

! " # $ % &! ' ( ) (! 9 :! ; " / < 0 < "! 9 0 & %. 0 % & =! < 0 ; <. < > > <! 9?! ". & %!

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

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

Corso di Reti di Calcolatori L-A

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

Corso di Reti di Calcolatori T

Reti di Calcolatori L-A Compito A Parte Java. Compito A. Parte C. Cognome: Matricola:

Corso di Reti di Calcolatori L-A

Programmazione distribuita in Java. Socket & Client-Server

Esercizio UDP e Shell Remote

Corso di Reti di Calcolatori

Network Programming. Java Programming Language. Network Programming TIGA 1

Protocollo UDP. User Data Protocol

Corso di Reti di Calcolatori T

Applicazioni web. Parte 10 Socket. Alberto Ferrari

Esercizio Trasferimento File e Multicast

PROVA FINALE Ingegneria del software

Modello client-server

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Socket in Java. Modelli di comunicazione

Corso di Reti di Calcolatori L-A

Parte II: Reti di calcolatori Lezione 11 (35)

Protocolli Internet. Canale di comunicazione. canale di comunicazione

Corso di Reti di Calcolatori L-A

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

Parte II: Reti di calcolatori Lezione 13 (37)

Lezione n.7 LPR- Informatica Applicata

Lezione n.5 LPR-Informatica Applicata 13/3/2006

Università degli Studi di Bologna Scuola di Ingegneria

Lezione n.7b. TCP Sockets & Multicast. 24/11/2009 Vincenzo Gervasi

Eccezioni Precisazioni e approfondimenti

Telematica II 12. Esercitazione/Laboratorio 4

Programmazione II: Esami Svolti

Esercizi su Java RMI. Progetto di Cliente / Servitore e supporto. Possibile tabella mantenuta dal server

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Applicazioni web. Parte 5 Socket

LETTURA DI DATI DA INPUT

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

Corso di Reti di Calcolatori T

System.out.print("\tATTENZIONE: hi inserito un valore non valido!\n");

Corso di Reti di Calcolatori T

Architettura Client-Server

A. Ferrari Stream e File

Note ed esercizi aggiuntivi

LETTURA DI DATI DA INPUT. Gli stream di byte consentono già di leggere dati (numeri di vario tipo), tramite la classe DataInputStream

Capitolo 13: Gestione delle eccezioni. Capitolo 13. Gestione delle eccezioni Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2

Iterazioni. L istruzione while. while (condition) istruzione

Esercitazione n 4. Capacità di analisi e di estensione di progetti esistenti Il concetto di filtro Linguaggio Java:

Lezione n.6 LPR- Informatica Applicata

9. Java: Introduzione al Networking

Esempio su strutture dati dinamiche: ArrayList

27/2/2006. Lezione n.3 LPR-Informatica Applicata sockets UDP. Università degli Studi di Pisa. Laura Ricci 1. Dipartimento di Informatica.

Anno Accademico 2003/04. Docente modulo 1: Annalisa De Bonis. Ripete l esecuzione di statement fino a che la condizione e` verificata

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

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

GESTIONE DEGLI ERRORI

Programmare con le Socket TCP

GESTIONE DEGLI ERRORI

import java.io.*; char sceltautente = '_'; boolean condizionesn = true; boolean condizionedowhile = true; boolean condizioneprogramma = true;

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Realizzare un applicazione console che stampi la somma dei primi n numeri dispari oppure pari (a scelta dell operatore). import java.io.

nella medesima via, ma a numeri civici diversi. In questo caso i numeri civici rappresenterebbero

Programmare con le Socket

Eccezioni. Corso di Programmazione CdS: Informatica e Tecnologie per la Produzione di Software Nicola Fanizzi.

Corso di Telematica II

Sockets in Java. Lorenzo Gallucci

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

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

Capitolo 2: Livello di applicazione

LPR 2005/2006 Lezione 6. Comunicazione tra gruppi di processi Gruppi di multicast Multicast affidabile Java Multicast API

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

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

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

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

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

Reti di Calcolatori:

import java.io.*; Pag. 1 di 15

Parte II: Reti di calcolatori Lezione 13 (37)

JAVA - I/O System. Il JAVA considera tutte i flussi da e verso l esterno, come stream di byte. Questi possono essere di ingresso o di uscita:

Networking. Mauro Migliardi Ph. D.

Laboratorio di reti I: Il pacchetto java.net

import java.io.*; boolean condizioneciclo = true;

Laboratorio di Sistemi Applicazioni distribuite Java

import java.io.*; import java.util.arraylist;

Corso di Reti di Calcolatori T

Pag. 1 di 7. import java.io.*;

Parte II: Reti di calcolatori Lezione 20 (44)

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

Programmazione di rete in Java Java fornisce per la gestione della comunicazione le classi del package di networking java.net

Transcript:

Università degli Studi di Bologna Scuola di Ingegneria Corso di Reti di Calcolatori T Esercitazione 1 (svolta) Socket Java senza connessione Luca Foschini Anno accademico 2017/2018 Esercitazione 1 1 Architettura client pkt1 line1 pkt2 pkt3 pkt2 pkt1 client rete server line2 line1 line2 line3 pkt3 line3 client Esercitazione 1 2

Specifica: il Client Sviluppare un applicazione C/S in cui il client, invocato con l indirizzo IP e la porta sulla quale il server è in ascolto, invia al server pacchetti contenenti il nome del file e il numero della linea del file che vuole ricevere, che sono richiesti all utente usando l input da console. Si noti l invio di un unico datagramma per più informazioni (perché non di due separati?) Successivamente il client 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. Per il settaggio del timeout sull operazione di lettura si faccia uso della funzione settimeout, invocata sulla socket dopo la costruzione della stessa. Attraverso tale funzione è infatti possibile evitare la condizione di blocco indefinito qualora si invochino operazioni bloccanti sul di una socket. Le primitive bloccanti saranno infatti sbloccate dopo un tempo pari al timeout settato. Esercitazione 1 3 Specifica: il Server Il server riceve la richiesta inviata dal client. Quindi verifica l esistenza del file richiesto e serve la richiesta. Se il file non esiste notifica l errore, altrimenti tenta di estrarre la linea richiesta. Infine, restituisce la risposta al client: se la linea non esiste invia una notifica di errore; altrimenti invia al client (o ai client) un pacchetto contenente la linea richiesta. NOTA: il server è realizzato come server sequenziale (e quindi mono-processo), che esegue un ciclo infinito in cui compie i seguenti passi fondamentali: 1. attesa di richiesta; 2. generazione della risposta; 3. invio della risposta. Esercitazione 1 4

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 primiilength bytes dell arrayibuf) 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. Esercitazione 1 5 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) Esercitazione 1 6

Schema di soluzione: il Client 1. Creazione socket, set di eventuali opzioni socket e creazione DatagramPacket: DatagramSocket socket = new DatagramSocket(); socket.settimeout(30000); byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port); 2. Interazione da console con l utente: BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); System.out.print("\n^D(Unix)/^Z(Win) invio per uscire, "+ "altrimenti inserisci nome file"); while ((nomefile=stdin.readline())!=null){ System.out.print("Numero linea? "); numlinea = Integer.parseInt(stdIn.readLine()); String richiesta=nomefile+" "+numlinea; Esercitazione 1 7 Schema di soluzione: il Client (ancora) 3. Creazione del pacchetto di richiesta con le informazioni inserite dall utente: ByteArrayOutputStream bostream = new ByteArrayOutputStream(); DataOutputStream dostream = new DataOutputStream(boStream); dostream.writeutf(richiesta); byte[] data = bostream.tobytearray(); 4. Riempimento ed invio del pacchetto al server: packet.setdata(data); socket.send(packet); 5. Inizializzazione e attesa del pacchetto di risposta: packet.setdata(buf); socket.receive(packet); 6. Estrazione delle informazioni dal pacchetto ricevuto: ByteArrayInputStream bistream = new ByteArrayInputStream(packet.getData(),0,packet.getLength()); DataInputStream distream = new DataInputStream(biStream); String risposta = distream.readutf(); Esercitazione 1 8

Schema di soluzione: il Server 1. Creazione socket e DatagramPacket: DatagramSocket socket = new DatagramSocket(port); byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf,buf.length); 2. Inizializzazione e attesa del pacchetto di richiesta: packet.setdata(buf); socket.receive(packet); 3. Estrazione delle informazioni dal pacchetto ricevuto: ByteArrayInputStream bistream = new ByteArrayInputStream(packet.getData(),0,packet.getLength()); DataInputStream distream = new DataInputStream(biStream); richiesta = distream.readutf(); StringTokenizer st = new StringTokenizer(richiesta); nomefile = st.nexttoken(); numlinea = Integer.parseInt(st.nextToken()); Esercitazione 1 9 Schema di soluzione: il Server (ancora) 4. Preparazione della risposta con la linea richiesta: String linea = LineUtility.getLine(nomeFile, numlinea); ByteArrayOutputStream bostream = new ByteArrayOutputStream(); DataOutputStream dostream = new DataOutputStream(boStream); dostream.writeutf(linea); data = bostream.tobytearray(); 5. Riempimento e invio del pacchetto al client: packet.setdata(data, 0, data.length); socket.send(packet); Ovviamente, si devono sempre fare close() di tutte le socket non più necessarie Esercitazione 1 10

public class LineUtility { LineUtility 1/2 // Metodo per restituire una linea specificata in una posizione 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) { e.printstacktrace(); return linea = "File non trovato"; { for (int i=1; i<=numlinea; i++) { linea = in.readline(); if ( linea == null) { linea = "Linea non trovata"; in.close(); return linea; catch (IOException e) { e.printstacktrace(); return linea = "Linea non trovata"; return linea; Esercitazione 1 11 LineUtility 2/2 /* Metodo per recuperare la linea successiva di un file già aperto in precedenza (servirà fra poco...): */ static String getnextline(bufferedreader in) { String linea = null; { if ((linea = in.readline()) == null) { in.close(); linea = "Nessuna linea disponibile"; catch (FileNotFoundException e) {e.printstacktrace(); return linea = "File non trovato"; catch (IOException e) {e.printstacktrace(); linea = "Nessuna linea disponibile"; return linea; Esercitazione 1 12

Line Client 1/3 public class LineClient { public static void main(string[] args) { InetAddress addr=null; int port = -1; {if (args.length == 2) {addr = InetAddress.getByName(args[0]); port = Integer.parseInt(args[1]); else{ System.out.println("Usage: java LineClient addr port"); System.exit(1); catch(unknownhostexception e){... DatagramSocket socket=null; DatagramPacket packet = null; byte[] buf = new byte[256]; { socket = new DatagramSocket(); socket.setsotimeout(30000); packet = new DatagramPacket(buf, buf.length, addr, port); catch (SocketException e) { e.printstacktrace();system.exit(2); Esercitazione 1 13 // parte di interazione con l utente Line Client 2/3 BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); System.out.print("\n^D(Unix)/^Z(Win) invio per uscire, altrimenti nome file"); { // strutture dati varie ByteArrayOutputStream bostream = null; DataOutputStream dostream = null; byte[] data = null; String nomefile = null; int numlinea = -1; String richiesta=null; String risposta = null; ByteArrayInputStream bistream = null; DataInputStream distream = null; while ((nomefile=stdin.readline())!=null) //Filtro ben fatto { { System.out.print("Numero linea? "); numlinea = Integer.parseInt(stdIn.readLine()); richiesta = nomefile+" "+numlinea; catch (Exception e) { System.out.println("Problemi nell'interazione da console: "); e.printstacktrace(); System.out.print("\n^D(Unix)/... "); continue; Esercitazione 1 14

Line Client 3/3 { // preparazione e spedizione richiesta bostream = new ByteArrayOutputStream(); dostream = new DataOutputStream(boStream); dostream.writeutf(richiesta); data = bostream.tobytearray(); packet.setdata(data); socket.send(packet); catch (IOException e){... { // inizializzazione e ricezione pacchetto packet.setdata(buf); socket.receive(packet); catch (IOException e){ /* come sopra */ { bistream = new ByteArrayInputStream( packet.getdata(),0,packet.getlength()); distream = new DataInputStream(biStream); risposta = distream.readutf(); // stampa risposta catch (IOException e){... System.out.print("\n^D(Unix)/^Z(Win..."); System.out.print("\n^D(Unix)/^Z(Win) invio per uscire, altrimenti nome file"); //while // catch(exception e){... socket.close(); System.out.println("LineClient:termino..."); Esercitazione 1 15 Line Server 1/3 public class LineServer { // Porta nel range consentito 1024-65535! private static final int PORT = 4445; public static void main(string[] args) {DatagramSocket socket = null; DatagramPacket packet = null; byte[] buf = new byte[256]; // Controllo argomenti input: 0 oppure 1 argomento (porta) if ((args.length == 0)) { port = PORT; else if (args.length == 1) { { port = Integer.parseInt(args[0]); // controllo argomento e che la porta sia nel range consentito 1024-65535 if (port < 1024 port > 65535) { System.out.println("Usage: java LineServer [serverport>1024]"); System.exit(1); catch (NumberFormatException e) { else {System.out.println("Usage: java LineServer [serverport>1024]"); System.exit(1); Esercitazione 1 16

Line Server 2/3 { socket = new DatagramSocket(port); packet = new DatagramPacket(buf, buf.length); catch (SocketException e) {... { String nomefile = null; int numlinea = -1; String richiesta = null; ByteArrayInputStream bistream = null; DataInputStream distream = null; StringTokenizer st = null; ByteArrayOutputStream bostream = null; DataOutputStream dostream = null; String linea = null; byte[] data = null; while (true) { { packet.setdata(buf); socket.receive(packet); catch(ioexception e){... continue; Esercitazione 1 17 { bistream = new ByteArrayInputStream( packet.getdata(),0,packet.getlength()); distream=new DataInputStream(biStream); richiesta = distream.readutf(); st = new StringTokenizer(richiesta); nomefile = st.nexttoken(); numlinea = Integer.parseInt(st.nextToken()); catch(exception e){/* come sopra */ Line Server 3/3 { String linea = LineUtility.getLine(nomeFile, numlinea); bostream = new ByteArrayOutputStream(); dostream = new DataOutputStream(boStream); dostream.writeutf(linea); data = bostream.tobytearray(); packet.setdata(data); socket.send(packet); catch(ioexception e){/* come sopra */ // while catch(exception e){... System.out.println("LineServer: termino.."); socket.close(); // main // class Esercitazione 1 18

Socket Multicast: architettura client join join server line rete join line client line join line client line Indirizzo Multicast Esercitazione 1 19 Specifica dettagliata Modificare il programma sviluppato nella prima parte dell esercitazione in modo che: I client non inviano più nessun pacchetto di richiesta al server, ma si associano al gruppo cui il server invia periodicamente le linee di un certo file, ne ricevono alcune (per es. 20), le stampano, poi si dissociano dal gruppo; il programma client è lanciato con due argomenti: l indirizzo multicast e la porta sulle quali il server trasmette. Il server invia periodicamente (per es. ogni 2 secondi) una linea di un certo file ad un prefissato indirizzo multicast (es. 230.0.0.1). Terminata la lettura, il server riprende dall inizio la lettura del file e continua ad eseguire per tutta la propria esistenza questo ciclo infinito di letture e spedizioni. Il server deve inoltre poter essere invocato da riga di comando con uno o due argomenti e cioè con la sola porta (in questo caso si utilizza l indirizzo multicast di default, es. 230.0.0.1), oppure l indirizzo multicast e la porta, presso cui effettuare gli invii. Esercitazione 1 20

Schema di soluzione: il Client Multicast 1. Creazione socket, set eventuali opzioni socket e creazione DatagramPacket: MulticastSocket socket = new MulticastSocket(port); socket.settimeout(20000); byte[] buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf, buf.length); 2. Adesione al gruppo multicast passato come argomento: address = InetAddress.getByName(args[0]); socket.joingroup(address); 3. Inizializzazione e ricezione del pacchetto di risposta: packet.setdata(buf); socket.receive(packet); 4. Estrazione delle informazioni dal pacchetto ricevuto: bistream = new ByteArrayInputStream(packet.getData(), 0, packet.getlength()); distream = new DataInputStream(biStream); risposta = distream.readutf(); 5. Uscita dal gruppo multicast socket.leavegroup(address); Esercitazione 1 21 Schema di soluzione: il Server Multicast 1. Creazione socket e DatagramPacket: socket = new MulticastSocket(port); byte[] data = new byte[256]; DatagramPacket packet = new DatagramPacket(data, data.length, group, port); 2. Adesione al gruppo multicast: address = InetAddress.getByName(stringAddr); socket.joingroup(address); 3. Preparazione della risposta da inviare: String linea = LineUtility.getNextLine(in); bostream = new ByteArrayOutputStream(); dostream = new DataOutputStream(boStream); dostream.writeutf(linea); data = bostream.tobytearray(); 4. Riempimento e invio del pacchetto a tutto il gruppo: packet.setdata(data); socket.send(packet); Esercitazione 1 22

Line Multicast Client 1/2 public class MulticastClient { public static void main(string[] args) { InetAddress group = null; int port = -1; { if (args.length == 2) { group = InetAddress.getByName(args[0]); port = Integer.parseInt(args[1]); else { System.out.println("Usage: java MulticastClient MCastAddr MCastPort"); System.exit(1); catch (Exception e){... System.exit(2); // creazione socket multicast e creazione datagram packet MulticastSocket socket = null; DatagramPacket packet = null; byte[] buf = new byte[256]; { socket = new MulticastSocket(port); socket.setsotimeout(20000); // 20 secondi packet = new DatagramPacket(buf,buf.length); System.out.println("Creata la socket: " + socket); catch (IOException e){... System.exit(3); Esercitazione 1 23 Line Multicast Client 2/2 { socket.joingroup(group); // adesione al gruppo associato System.out.println("Adesione al gruppo " + addr); catch (IOException e){... System.exit(4); ByteArrayInputStream bistream = null; DataInputStream distream = null; String linea = null; for (int i = 0; i < 20; i++) // ciclo di ricezione { {packet.setdata(buf); socket.receive(packet); catch (SocketTimeoutException te) { System.out.println("Non ho ricevuto niente per 20 secondi, chiudo!"); System.exit(4); catch (IOException e) {... continue; { bistream = new ByteArrayInputStream(packet.getData(),0,packet.getLength()); distream = new DataInputStream(biStream); linea = distream.readutf(); System.out.println("Linea ricevuta: " + linea); catch (IOException e) {... continue; System.out.println("\nUscita dal gruppo"); // uscita dal gruppo e chiusura della socket { socket.leavegroup(addr); catch (IOException e) {... System.out.println("MulticastClient: termino..."); socket.close(); Esercitazione 1 24

Line Multicast Server 1/3 public class MulticastServer { /* File da dove leggo, nella directory dove viene lanciato il server */ private static final String FILE = "saggezza.txt"; private static BufferedReader in = null; private static boolean morelines = true; public static void main(string[] args) { long WAIT = 1000; int port = -1; InetAddress group = null; // Indirizzo del gruppo multicast e porta { if (args.length == 1) { group = InetAddress. getbyname("230.0.0.1"); port = Integer.parseInt(args[0]); else if (args.length == 2) { group = InetAddress.getByName(args[0]); port = Integer.parseInt(args[1]); else { System.out.println("Usage:..."); System.exit(1); catch (Exception e) {... System.exit(1); Esercitazione 1 25 Line Multicast Server 2/3 // Creazione datagram packet e socket MulticastSocket socket = null; byte[] data = new byte[256]; DatagramPacket packet = new DatagramPacket(data, data.length, group, port); { socket = new MulticastSocket(port); socket.joingroup(group); System.out.println("Socket: " + socket); catch (Exception e) {... int count = -1; // contatore per debug ByteArrayOutputStream bostream = null; DataOutputStream dostream = null; while (true) { count = 0; morelines = true; // azzero count e indicatore linee { // costruisco un nuovo buffered reader in = new BufferedReader(new FileReader(FILE)); catch (Exception e) {... continue; while (morelines) { count++; byte[] buf = new byte[256]; // estrazione della linea String linea = LineUtility.getNextLine(in); if (linea.equals("nessuna linea disponibile")) { morelines = false; break; //esco dal ciclo Esercitazione 1 26

Line Multicast Server 3/3 { bostream = new ByteArrayOutputStream(); dostream = new DataOutputStream(boStream); dostream.writeutf(linea); data = bostream.tobytearray(); packet.setdata(data); socket.send(packet); catch (Exception e) {... continue; // attesa tra un invio e l'altro... { Thread.sleep( 2 * WAIT ); catch (Exception e) {... continue; // while interno // while esterno // main // class Esercitazione 1 27 Problemi utilizzo MulticastSocket Uso multicast in reti locali In alcune reti locali il multicast potrebbe essere disabilitato. Uso multicast in computer non connessi in rete I problemi d uso delle MulticastSocket con computer non connessi in rete, si possono superare impostando l'interfaccia di rete PRIMA della join. Bisogna quindi sostituire questo codice: socket.joingroup(group); Con il seguente: // mi procuro l Inetaddress locale InetAddress netinterface = InetAddress.getByName("localhost"); // imposto l'interfaccia di rete socket.setinterface(netinterface); socket.joingroup(group); Per risolvere questo ed altri problemi realizzativi che si possono presentare durante il corso si tenga sempre monitorata la sezione FAQ del sito!!! Esercitazione 1 28