View Full Version : [JAVA]UDP Multicast
Raga sto cercando di fare un multicast con il protocollo udp per inviare un datagram a tanti utenti in una volta sola.
Ho provato diverso codice ma non va, il client non riceve.
Non è che il problema è che lo testo in locale?
The3DProgrammer
14-07-2006, 23:56
Raga sto cercando di fare un multicast con il protocollo udp per inviare un datagram a tanti utenti in una volta sola.
Ho provato diverso codice ma non va, il client non riceve.
Non è che il problema è che lo testo in locale?
se per locale intendi sulla tua macchina la risposta è si. Se invece intendi sulla tua LAN (con locale intesa come non connessa ad internet), il problema credo sia nel codice, a meno che il tuo router nn sia in grado di gestire i gruppi multicast.
ciao;)
EDIT: dimenticavo, se posti il codice ci togliamo anche qualke dubbio :)
Ciao, io intendo propria sulla stessa macchina(ho un solo pc :( ), non c'è modo di testare il codice?
Io sto utilizzando pèer la prima volta questo protocollo e quindi devo sempre testare cioè che scrivo, non posso rompere le palle sempre a qualcuno...
A scanso di equivoci il codice è molto semplice ed è questo:
MULTICAST SENDER (SERVER)
import java.net.*;
import java.io.*;
public class MulticastSender
{
public static void main( String[] argv )
{
try
{
// get the InetAddress of the MCAST group
InetAddress ia = InetAddress.getByName("228.5.6.7");
// get the port that we will be listening on
int recvPort =6789;
// create a datagram with a suitable message
String str = "Hello from: "+InetAddress.getLocalHost();
byte[] data = str.getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, ia, recvPort);
// create a multicast socket bound to any local port
MulticastSocket ms = new MulticastSocket();
//Join the multicast group
ms.joinGroup(ia);
// send the message with a Time-To-Live (TTL)=1
ms.send(dp, (byte)1);
// tidy up - leave the group and close the socket
ms.leaveGroup(ia);
ms.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
MULTICAST RECEIVER
import java.net.*;
import java.io.*;
public class MulticastReceiver
{
public static void main( String[] argv )
{
try
{
// get the InetAddress of the MCAST group
InetAddress ia = InetAddress.getByName("228.5.6.7");
// get the port that we will be listening on
int port = 6789;
// create a multicast socket on the specified local port number
MulticastSocket ms = new MulticastSocket( port );
// create an empty datagram packet
DatagramPacket dp = new DatagramPacket(new byte[128], 128);
//Join a multicast group and wait for some action
ms.joinGroup(ia);
System.out.println( "waiting for a packet from "+ia+"...");
ms.receive(dp);
// print out what we received and quit
System.out.println( new String(dp.getData() ));
ms.leaveGroup(ia);
ms.close();
}
catch (IOException e) {
System.out.println(e);
}
}
}
In pratica avvio il receiver il quale rimane in attesa di un pacchetto, poi avvio il sender ma al receiver non arriva nulla...
The3DProgrammer
15-07-2006, 11:04
il codice mi sembra corretto, ad okkio. Che io sappia non puoi testarlo sul tuo host ma necessiti di un router (almeno nei progetti che ho realizzato in cui ho usato multicast ho fatto così) che supporti i gruppi multicast. Cmq a scanso di equivoci googla un po per vedere se trovi una soluzione;)
ciauz
Puoi usare qemu:
http://fabrice.bellard.free.fr/qemu/
in modo da avere una macchina virtuale con cui comunicare.
Di solito lo uso per testare applicazioni Java RMI.
A proposito, java rmi e' di piu' alto livello, non dovresti preoccuparti
del protocollo.
Che immagine di OS mi consigli di usare? basta anche il Freedos?
Ma poi non ho capito una cosa, utilizzando questo metodo, è SICURO che andrà sempre o dipende dal sistema operativo, dal modem, dalla rete?
Se si tratta di una rete locale c'è caso che non vadi? Se invece si parla di internet va sempre?
Non ho ben capito...perchè altrimenti non perdo tempo a cercare di testare il codice multicast, ma me lo scrivo io una sorta di multicast.
Quello che devo fare tanto penso si possare fare anche senza multicast, in pratica ho un server e diversi client, i client mandano i loro dati al server il quale li spedisce a tutti i client connessi, non credo sia difficile da fare anche senza multicast.
The3DProgrammer
15-07-2006, 12:34
Ma poi non ho capito una cosa, utilizzando questo metodo, è SICURO che andrà sempre o dipende dal sistema operativo, dal modem, dalla rete?
Se si tratta di una rete locale c'è caso che non vadi? Se invece si parla di internet va sempre?
Non ho ben capito...perchè altrimenti non perdo tempo a cercare di testare il codice multicast, ma me lo scrivo io una sorta di multicast.
Quello che devo fare tanto penso si possare fare anche senza multicast, in pratica ho un server e diversi client, i client mandano i loro dati al server il quale li spedisce a tutti i client connessi, non credo sia difficile da fare anche senza multicast.
C'è da precisare una cosa: internet NON E' multicast. Si, è vero, ci sono tentativi di standardizzazione in corso, esistono isole multicast connesse in tunneling, ma cmq non è possibile essere sicuri che un programma che usi i gruppi multicast funzioni. Anche perkè tra l'altro, come hai detto MulticastSocket si basa su UDP, il che è tutto dire. Questo discorso vale anche per le LAN, anche se oramai quasi tutti i router supportano i gruppi multicast ed è molto difficile che un pacchetto UDP si perda su una LAN. Per cui ti consiglio di usare i socket classici o RMI, soprattutto se devi realizzare qualkosa che richieda sicurezza in termini di ricezione dei pacchetti e di arrivo in ordine (che so, un protocollo di sincronizzazione od altro....).
ps. xlovaz:
tra l'altro nn è necessario usare 2 macchine x testare programmi che usano RMI, basta avviare + server sulla stessa macchina su porte diverse ;)
ciauz
Anche perkè tra l'altro, come hai detto MulticastSocket si basa su UDP, il che è tutto dire.
anche perché multicast su TCP...
riesci a provare con una macchina linux? almeno abiliti facilmente il multicast, usando windows come router non so se funziona... ci sarà il modo, ma non lo conosco
Ma poi non ho capito una cosa, utilizzando questo metodo, è SICURO che andrà sempre o dipende dal sistema operativo, dal modem, dalla rete?
Se si tratta di una rete locale c'è caso che non vadi? Se invece si parla di internet va sempre?
Non ho ben capito...perchè altrimenti non perdo tempo a cercare di testare il codice multicast, ma me lo scrivo io una sorta di multicast.
Quello che devo fare tanto penso si possare fare anche senza multicast, in pratica ho un server e diversi client, i client mandano i loro dati al server il quale li spedisce a tutti i client connessi, non credo sia difficile da fare anche senza multicast.
E' sicuro che andra' sempre in lan ( se l'hai testato in lan ) in quanto la JVM e' la stessa per tutte le macchine, nn dipende dal SO, ne tanto meno dalla macchina sulla quale gira.
Se provi su internet il codice che hai scritto non ti andra' mai perche' hai settato il TimeToLive a 1
ps. xlovaz:
tra l'altro nn è necessario usare 2 macchine x testare programmi che usano RMI, basta avviare + server sulla stessa macchina su porte diverse ;)
ciauz
Sì, lo so, ma ogni tanto è bene provare con 2 macchine,
per vedere come va in presenza di firewall, per esempio,
o se l'hostname è settato correttamente con rmid, rmiregistry, ecc.
Comunque uso frodo, o damn small se mi serve la grafica.
Non credo esista java per freedos.
The3DProgrammer
16-07-2006, 19:14
Sì, lo so, ma ogni tanto è bene provare con 2 macchine,
per vedere come va in presenza di firewall, per esempio,
o se l'hostname è settato correttamente con rmid, rmiregistry, ecc.
Comunque uso frodo, o damn small se mi serve la grafica.
Non credo esista java per freedos.
c'hai ragione ;)
C'è da precisare una cosa: internet NON E' multicast. Si, è vero, ci sono tentativi di standardizzazione in corso, esistono isole multicast connesse in tunneling, ma cmq non è possibile essere sicuri che un programma che usi i gruppi multicast funzioni. Anche perkè tra l'altro, come hai detto MulticastSocket si basa su UDP, il che è tutto dire. Questo discorso vale anche per le LAN, anche se oramai quasi tutti i router supportano i gruppi multicast ed è molto difficile che un pacchetto UDP si perda su una LAN. Per cui ti consiglio di usare i socket classici o RMI, soprattutto se devi realizzare qualkosa che richieda sicurezza in termini di ricezione dei pacchetti e di arrivo in ordine (che so, un protocollo di sincronizzazione od altro....).
ps. xlovaz:
tra l'altro nn è necessario usare 2 macchine x testare programmi che usano RMI, basta avviare + server sulla stessa macchina su porte diverse ;)
ciauz
Ritiro su la questione xkè ho nuovamente bisogno di alcune info su multicast.
Se ho capito bene se devo realizzare un'applicazione per INTERNET non posso usare il multicast?
Serve solo per le LAN? Volevo chiarare questa cosa...
Ritiro su la questione xkè ho nuovamente bisogno di alcune info su multicast.
Se ho capito bene se devo realizzare un'applicazione per INTERNET non posso usare il multicast?
Serve solo per le LAN? Volevo chiarare questa cosa...
il multicast non serve solo per le LAN, funziona anche in internet
ad esempio rosso alice usa multicast, sempre se ricordo bene l'ip che ho visto :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.