2010-12-09 10 views

Antwort

14

Senden Multicast-Datagramme

Um jede Art von Datagramms in Java zu schicken, es Unicast, Broadcast oder Multicast, braucht man ein java.net.DatagramSocket:

DatagramSocket socket = new DatagramSocket(); 

Man kann eine lokale optional liefern Port zum DatagramSocket-Konstruktor, an den der Socket gebunden werden muss. Dies ist nur notwendig, wenn wir andere Parteien benötigen, um uns in einem bestimmten Hafen erreichen zu können. Ein dritter Konstruktor übernimmt den lokalen Port UND die lokale IP-Adresse, an die er binden soll. Dies wird (selten) bei Multi-Homed-Hosts verwendet, bei denen es wichtig ist, auf welchem ​​Netzwerkadapter der Datenverkehr empfangen wird.

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); 
} 

Empfangen von Multicast-Datagramme

Man kann eine normale Datagram verwenden, um Unicast- und Broadcast-Datagramme zu senden und empfangen und Multicast-Datagramme zu senden. Um Multicast-Datagramme zu empfangen, benötigt man jedoch einen MulticastSocket. Der Grund dafür ist einfach, es muss zusätzliche Arbeit geleistet werden, um Multicast-Verkehr von allen Protokollschichten unter UDP zu steuern und zu empfangen.

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! 
} 

Für weitere Informationen:

+0

Ist es möglich, dass jeder Client Broadcast-Gruppen senden und empfangen kann? (durch Definieren von 2 Sockets als DatagramSocket für Senden und MulticastSocket für Empfangen) – Razavi

1

Sie haben zu senden, dass von hinten nach vorne kommen. Sie empfangen Multicasts über eine MulticastSocket, aber Sie müssen sie nicht so senden: Sie können sie über eine DatagramSocket senden.

Siehe Java Tutorial, Custom Networking trail.

+0

Ich bin mir nicht sicher, wie zutreffend der obige Kommentar ist. Ich konnte kein Multicast-Paket über einen normalen DatagramSocket senden. Erst als ich begann, eine MulticastSocket auf der Serverseite zu verwenden, zeigte sie mir den ausgehenden Datenverkehr, wenn ich die Pakete am Serverende schnüffelte. –