












Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Una panoramica dettagliata sull'utilizzo dei datagrammi e dei socket multicast in java. Esplora la creazione e la gestione dei datagrammi, la conversione dei tipi di dati in byte array e l'implementazione di server e client multicast. Include esempi di codice per illustrare i concetti chiave, come l'invio e la ricezione di pacchetti, la gestione degli indirizzi ip e delle porte, e la sottoscrizione a gruppi multicast. Utile per studenti e sviluppatori che desiderano comprendere e implementare comunicazioni di rete basate su datagrammi e multicast in java, offrendo una guida pratica e teorica.
Tipologia: Appunti
1 / 20
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!













L'alternativa al protocollo TCP è il protocollo UDP (user Datagram Protocol):
La consegna dei dataframe a destinazione non è garantita. Anche l'ordine di arrivo non è necessariamente rispettato.
Un datagram è un messaggio che contiene tutto al suo interno ed è indipendente. Viene mandato lungo la rete, il cuia arrivo, tempo e contenuto non sono garantiti (affidabilità molto bassa). Nel socket java.net ci sono 3 classi da utilizzare:
Si tratta della classe che rappresenta il pacchetto che può essere inviato / ricevuto), i dati contenuti sono dei byte. I costruttori più importanti sono:
Un server che riceve una sequenza di numeri interi e scrive sullo standard output i valori letti e la loro somma. Ad ogni valore ricevuto scrive i risultati. Poichè la comunicazione è a senso unico (client --> server) e qualora la perdita di qualche dato non comporti grossi problemi si può isare una connessione UDP. Il pacchetto (datagram) deve contenere il numero intero da inviare.
Il contenuto di un DatagramPacket è un vettore di byte:
Sfruttiamo il vincolo relativo ai valori numerici generati: "Un client che genera 10 numeri casuali compresi tra 1 e 100.. " è sufficente 1 byte che rappresenta gli interi compresi tra - 128 e + 127 Usiamo il metodo della classe Integer: byte byteValue() public byte byteValue(): Restituisce il valore dell'oggetto intero dopo aver effettuato una conversione che restringe.
Questo tipo di conversione può causare perdita di informazioni in quanto di eliminano tutti i bit ulteriori rispetto a quelli che possono essere rappresentati (un intero che richiede 4 byte viene modellato in 1 solo byte perdo 3 byte).
int n Integer Integer.valueOf (n) byte (Integer.valueOf(n)).byteValue()
byte b Byte Byte.valueOf (b) int (Byte.valueOf(n)).intValue()
import java.io.; import java.util.Random; import java.net.; public class** Client { private static final int MAX = 100; private static final String host = "localhost"; public static voi d main(String[] args) throws IOException, InterruptedException { InetAddress addr = InetAddress.getByName(host);
Immaginiamo che il server ogni volta che calcola una nuova somma la voglia inviare a dei processi interessati, detti verificatori. A questo punto il nostro sistema è composto da tre tipologie di processi:
Prima di procedere bisogna affrontare due aspetti chiave riguardo alla presenza dei verificatori:
Non possiamo più usare 1 solo byte per rappresentare gli interi perchè i valori tramessi potrebbero non essere all'interno dell'intervallo [-128; 127]. Il contenuto di un DatagramPacket è un vettore di byte:
Trasformare un int in un byte[4] è necessario specificare la modalità di codifica:
riceverla, si definisce il gruppo di coloroc he sono interessati.
La tramissione multicast, per convenzione devono essere indirizzare a un indirizzo IP compreso tra:
Costruttore principale: MulticastSocket (int port) Per inviare e ricevere datagram si usano i seguenti metodo:
La definizione di un gruppo e la sottoscrizione ad esso è più macchinosa e si basa su seguente metodo: void joinGroup (SocketAddress mcstaddr, Networkinterface ne) SocketAddress è una classe astratta rappresentante l'indirizzo del Socket:
Il server userà l'indirizzo 224.0.0.1 e la porta 18002 per il multicast. Definiamo la seguenti costanti: public static final int portOut = 18002; public static final String mtcAddr = "224.0.0.1"; Il server continuerà a usare la porta 18001 per ricevere i datagram che arrivano dai client:
public class ServerMultiCast { public static final int port = 18001; public static final int portOut = 18002; public static final String mtcAddr = "224.0.0.1"; public static void main(String[] args) throws Exception { DatagramSocket dsIn = new DatagramSocket(port); MulticastSocket mcs = new MulticastSocket(portOut); InetSocketAddress iaddr = new InetSocketAddress(mtcAddr,portOut); InetAddress group = InetAddress.getByName(mtcAddr); mcs.joinGroup(iaddr, NetworkInterface.getByInetAddress(group)); int somma = 0, val = 0; byte[] buf = new byte[1]; while(true){ Thread.sleep(2000); DatagramPacket p = new DatagramPacket(buf, buf.length); dsIn.receive(p); buf = p.getData(); val = (Byte.valueOf(buf[0])).intValue(); somma += val; System.out.println("Letto: " + val +"; Somma: " + somma); byte[] tmp = my_int_to_bb_be(somma); DatagramPacket out = new DatagramPacket(tmp,tmp.length,group,portOut); mcs.send(out); } } private static byte[] my_int_to_bb_be(int myInteger){ ByteBuffer tmpbb = ByteBuffer.allocate(4); tmpbb.order(ByteOrder.BIG_ENDIAN); tmpbb.putInteger(myInteger); return(tmpbb.array()); } }
Per ricevere i multicast istanzia un oggetto di classe MulticastSocket sulla porta: ServerMulticast.portOut (18002) MulticastScoket mcs = new MulticastSocket(ServerMulticast.portOut); Il gruppo cui aderire viene definito nel seguente modo. Si costruisce un oggetto InetSocketAddress con:
InetAddress addr = InetAddress.getByName(host); Random rG = new Random(); DatagramSocket ds = new DatagramSocket(); byte[] buf = new byte[1]; int num; for(int i=1; i<11; i++) { num = rG.nextInt(MAX); System.out.println("Generato " + num); buf[0] = (Integer.valueOf(num)).byteValue(); DatagramPacket data = new DatagramPacket(buf,buf.length,addr, ServerMultiCast.port); System.out.println("Client invia a " + data.getAddress() + " Porta: " + data.getPort()); ds.send(data); Thread.sleep(1000); } ds.close(); } }
public class ServerMultiCast { public static final int port = 18001; public static final int portOut = 18002; public static final String mtcAddr = "224.0.0.1"; public static void main(String[] args) throws Exception { DatagramSocket dsIn = new DatagramSocket(port); MulticastSocket mcs = new MulticastSocket(portOut); InetSocketAddress iaddr = new InetSocketAddress(mtcAddr,portOut); InetAddress group = InetAddress.getByName(mtcAddr); mcs.joinGroup(iaddr, NetworkInterface.getByInetAddress(group)); int somma = 0, val = 0;
byte[] buf = new byte[1]; while(true){ Thread.sleep(2000); DatagramPacket p = new DatagramPacket(buf, buf.length); dsIn.receive(p); buf = p.getData(); System.out.println("Server riceve da: " + p.getAddress() + " Porta: "+ p.getPort()); val = (Byte.valueOf(buf[0])).intValue(); somma += val; System.out.println("Letto: " + val +"; Somma: " + somma); byte[] tmp = my_int_to_bb_be(somma); DatagramPacket out = new DatagramPacket(tmp,tmp.length,group,portOut); mcs.send(out); System.out.println("Server invia a " + out.getAddress() + " Porta: " + out.getPort()); } }
public class Verificatore { public static void main(String[] args) throws IOException { MulticastSocket mcs = new MulticastSocket(ServerMultiCast.portOut); InetSocketAddress iaddr = new InetSocketAddress(ServerMultiCast.mtcAddr, ServerMultiCast.portOut); InetAddress group = InetAddress.getByName(ServerMultiCast.mtcAddr); mcs.joinGroup(iaddr, NetworkInterface.getByInetAddress(group)); byte[] buf = new byte[4]; int num; while (true) { DatagramPacket data = new DatagramPacket(buf,4); mcs.receive(data); System.out.println("Verificatore riceve da:" +
Random rG = new Random(); DatagramSocket ds = new DatagramSocket(); byte[] buf = new byte[1]; int num;
Dipende dal costruttore di DatagramSocket del Client. Quello che vediamo è il valore restituito dal metodo int getLocalPort():
Generato dal client Generato dal Server Indirizzo: 224.0.0.1 Indirizzo: 10.0.0. Porta: 180012 Porta: 18002 Indirizo: 224.0.01 Indirizzo: 10.0.0. Porta: 18002 Porta: 18002 In questo caso la corrispondenza è tra: