2010-12-09 7 views

Répondre

14

Envoi datagrammes multicast

Pour envoyer tout type de datagrammes en Java, que ce soit unicast, broadcast ou multicast, on a besoin d'un java.net.DatagramSocket:

DatagramSocket socket = new DatagramSocket(); 

On peut éventuellement fournir local port vers le constructeur DatagramSocket auquel le socket doit se lier. Ceci est seulement nécessaire si l'on a besoin d'autres parties pour pouvoir nous joindre à un port spécifique. Un troisième constructeur prend le port local ET l'adresse IP locale à laquelle lier. Ceci est utilisé (rarement) avec des hôtes multi-hébergés où il est important sur quelle carte réseau le trafic est reçu.

DatagramSocket socket = new DatagramSocket(); 

byte[] b = new byte[DGRAM_LENGTH]; 
DatagramPacket dgram; 

dgram = new DatagramPacket(b, b.length, 
    InetAddress.getByName(MCAST_ADDR), DEST_PORT); 

System.err.println("Sending " + b.length + " bytes to " + 
    dgram.getAddress() + ':' + dgram.getPort()); 
while(true) { 
    System.err.print("."); 
    socket.send(dgram); 
    Thread.sleep(1000); 
} 

Réception datagrammes multicast

On peut utiliser une DatagramSocket normale pour envoyer et recevoir des datagrammes unicast et de diffusion et d'envoyer des datagrammes de multidiffusion. Cependant, pour recevoir des datagrammes de multidiffusion, il faut un MulticastSocket. La raison en est simple, un travail supplémentaire doit être effectué pour contrôler et recevoir le trafic de multidiffusion par toutes les couches de protocole inférieures à UDP.

byte[] b = new byte[BUFFER_LENGTH]; 
DatagramPacket dgram = new DatagramPacket(b, b.length); 
MulticastSocket socket = 
    new MulticastSocket(DEST_PORT); // must bind receive side 
socket.joinGroup(InetAddress.getByName(MCAST_ADDR)); 

while(true) { 
    socket.receive(dgram); // blocks until a datagram is received 
    System.err.println("Received " + dgram.getLength() + 
    " bytes from " + dgram.getAddress()); 
    dgram.setLength(b.length); // must reset length field! 
} 

Pour plus d'informations:

+0

Est-il possible que chaque client puisse envoyer et recevoir sur un groupe de diffusion? (en définissant 2 socket comme DatagramSocket pour send et MulticastSocket pour receive) – Razavi

1

Vous avez ce retour à l'avant. Vous recevoir des multidiffusions à travers un MulticastSocket mais vous n'avez pas besoin de les envoyer de cette façon: vous pouvez les envoyer via un DatagramSocket. Voir le Java Tutorial, Custom Networking trail.

+0

Je ne suis pas sûr de la véracité de ce commentaire. Je n'ai pas pu envoyer de paquet de multidiffusion via un DatagramSocket normal. Ce n'est que lorsque j'ai commencé à utiliser un MulticastSocket côté serveur que j'ai commencé à me montrer le trafic sortant en reniflant les paquets à la fin du serveur. –

Questions connexes