Newsgroup: it.comp.java
Titolo: trasmettere a tutti

Come si puo' fare per trasmettere delle informazioni in contemporanea a piu'
computer in ascolto ?
Ciao
---------------------------------------
Email: sostituire "nospam" con "netsis"


Beh, vi sono degli appositi indirizzi IP che servono per mandare i
pacchetti in Broadcast od in Multicast...
Qual é precisamente il tuo problema?
Ciao!
Matteo!!!

Qual é precisamente il tuo problema?
Vorrei fare una applicazione (con il linguaggio Java naturalmente) in cui e'
presente una fonte di informazioni e a cui possono collegarsi tanti ricevitori.
In ambito didattico la vorrei utilizzare come una specie di proiettore di
diapositive da utilizzare in una rete locale
Per non dover ritrasmettere la stessa immagine a tutti i computer collegati alla
sorgente (come normalmente si fa con una applicazione client/server che utilizza
i socket), sarebbe utile avere un meccanismo che permetta di trasmettere una
sola volta a tutti


presente una fonte di informazioni e a cui possono collegarsi tanti ricevitori.
Un suggerimento e` di dare un'occhiata alla libreria Voyager,
della ObjectSpace; fra le varie cose carine che fornisce per
la "programmazione distribuita", comprende anche un modello
"publisher/subscriber" per il multicast distribuito in rete
(anche non-locale).  Voyager e` lo "stato dell'arte" in termini
di programmazione distribuita -- gli RMI, in confronto,
fanno solo pena.
Voyager e` in Java e per Java; la versione "Pro", che
include supporto avanzato per il transazionale, la sicurezza,
e gli Enterprise Javabeans, e` a pagamento, ma le
versioni liberamente scaricabili dalla URL:
http://www.objectspace.com/developers/voyager/downloads/index.html
sono invece gratuite (verifica nei dettagli la licenza, se
occorre: sicuramente sono gratis per uso personale e/o
didattico, CREDO anche per l'uso in applicazioni di tipo
commerciale, ma non sono sicuro al 100%).  Tra l'altro,
la versione 2.0 (che non ho provato) dovrebbe anche
essere compatibile con CORBA (nella 1.0, invece, gli
oggetti Voyager "parlavano" solo con altri oggetti pure
Voyager).  Magari facci sapere come ti ci trovi...!
Alex

diapositive da utilizzare in una rete locale
In effetti, come ti accennavo nel messaggio precedente, il livello IP
prevede dei particolari indirizzi (detti di classe D) che per
l'appunto non identificano una macchina univoca nelle rete bensì
identificano un *gruppo* di macchine nella rete che è esattamente ciò
che serve a te.
Gli indirizzi Multicast si dividono in due categorie: quelli fissi che
esistono sempre a prescindere dal fatto che vi siano o meno macchine
che appartengono al gruppo e quelli dinamici che vengono costruiti di
volta in volta in base alle necessità. È quindi possibile per una
macchina "iscriversi" ad un particolare gruppo finchè ha delle
applicazioni che lo richiedono per poi "deiscriversi" nel momento in
cui tali applicazioni non vi sono più.
Lo scotto da pagare per tutto questo è dato dal fatto che il
protocollo di comunicazione per entrare a far parte oppure cancellarsi
da un gruppo lavora allo stesso livello di ICMP (il protocollo si
chiama IGMP e lo puoi trovare nella RFC 1112) e di conseguenza
richiede dei raw-socket per essere utilizzato (cosa che Java, se non
sbaglio, non permette di fare).
Non so se per caso esistano dei nuovi standard (il testo che ho
consultato ha un paio d'anni...) che permettano di utilizzare IGMP
anche a livello TCP. Se per caso dovessi trovare qualcosa del genere
fallo sapere anche a me! :-P
Ciao!
Matteo!!!

 sola volta a tutti
Multicast permette di inviare pacchetti UDP a un pool di indirizzi IP, facendo
si che la replicazione non debba essere esplicitamente gestita dall'applicazione,
ma venga gestita ad un livello network sottostante. Cio' non significa che la "stessa
immagine" non venga ritrasmessa ad ogni client (essenno' come fanno i client a
vederla? :) ) ma che tale ritrasmissione viene gestita solo in modo minimo
dall'applicazione. In particolare, in Java, puoi usare una java.net.MulticastSocket.
Inoltre ci sono i "dettagli" :) dovuti al fatto che le socket multicast "parlano" UDP 
e non TCP.
Cio' detto (magari ne sapevi gia' tutto!) e considerando che in rete locale
i problemi di perdita di pacchetti sono pressoche' trascurabili, direi che e' 
una buona possibilita' per la tua idea!
Saluti,
	Cris

puoi usare una java.net.MulticastSocket
Grande !
Questa sera sono riuscito a fare qualche esperimento su di una piccola rete
formata da due computer 196.200.0.1 e 196.200.0.2
Sembra che tutto funzioni bene. Nei prossimi giorni provero' a serializzare
delle immagini. Per il momento mi sono accontentato di qualche stringa
Mi rimane oscuro l'utilizzo degli indirizzi di classe D. Le mie macchine hanno
degli indirizzi di classe C
Seguendo l'esempio della documentazione (API JDK 1.1.6) ho definito
InetAddress group = InetAddress.getByName("228.5.6.7");
su tutte e due le macchine e tutto ha funzionato correttamente. Come mai non ho
dovuto ridefinire l'indirizzo IP delle macchine ?
Ciao
PS: se qualcuno e' interessato posso postare il codice dell'esempio giocattolo
che ho sviluppato



Beh, l'assegnamento di indirizzi IP di classe D avviene in maniera
dinamica nei casi in cui gli indirizzi non sono fissatti dall'ente
preposto di conseguenza presumo che tale assegnamento dinamico venga
svolto da metodi nativi (in quanto lavora a livello IP e non TCP od
UDP)  dalle classi da te utilizzate...
Questa e' soltanto un'opinione... per ragguagli ti consiglio di dare
un'occhiata ai sorgenti delle classi! :)
Ciao!
Matteo!!!