Kleines Beispiel zur Multicast Kommunikation über JGroups

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schaut mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.jgroups.ChannelClosedException;
import org.jgroups.ChannelNotConnectedException;
import org.jgroups.JChannel;
import org.jgroups.Message;

/**
 * @author Tom
 * 
 */
public class JGroupsExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        String props = "UDP(mcast_addr=224.0.0.150;mcast_port=5555):PING";
        final JChannel channel = new JChannel(props);
        System.out.println("Channel ready...");
        channel.connect("BUBU");

        ExecutorService executorService = Executors.newSingleThreadExecutor();

        executorService.execute(new Runnable() {
            public void run() {
                while (channel.isOpen()) {
                    try {
                        String data = "XXX " + System.currentTimeMillis();
                        System.out.println(channel.getLocalAddress()
                                + " Sending... " + data);

                        channel.send(new Message(null, channel
                                .getLocalAddress(), data));

                    } catch (ChannelNotConnectedException channelNotConnectedException) {
                        channelNotConnectedException.printStackTrace();
                    } catch (ChannelClosedException channelClosedException) {
                        channelClosedException.printStackTrace();
                    }

                    try {
                        System.out.println(channel.getLocalAddress()
                                + " Received: " + channel.receive(0));
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }

                    try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException interruptedException) {
                        interruptedException.printStackTrace();
                    }
                }
            }
        });

        TimeUnit.MINUTES.sleep(2);
        executorService.shutdown();
        channel.close();

    }

}

Startet man davon mehrere Anwendungen bekommt man beispielsweise folgende Ausgabe (für 3 Clients):
Code:
log4j:WARN No appenders could be found for logger (org.jgroups.JChannel).
log4j:WARN Please initialize the log4j system properly.
Channel ready...
192.168.174.1:1758 Sending... XXX 1178746249562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1758 (1 headers), size = 21 bytes]
192.168.174.1:1758 Sending... XXX 1178746254562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1761 (1 headers), size = 21 bytes]
192.168.174.1:1758 Sending... XXX 1178746259562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1764 (1 headers), size = 21 bytes]
192.168.174.1:1758 Sending... XXX 1178746264562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1755 (1 headers), size = 21 bytes]
192.168.174.1:1758 Sending... XXX 1178746269562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1758 (1 headers), size = 21 bytes]
192.168.174.1:1758 Sending... XXX 1178746274562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1761 (1 headers), size = 21 bytes]
192.168.174.1:1758 Sending... XXX 1178746279562
192.168.174.1:1758 Received: [dst: 224.0.0.150:5555, src: 192.168.174.1:1764 (1 headers), size = 21 b

Gruß Tom
 
Hallo,

das ist ein Peer to Peer Netz ;-) Eine Nachricht die von einem "Peer" in den Channel geschickt wird, wird (in diesem Beispiel) auch von jedem Empfangen.

Gruß Tom
 
Hi Tom
224.0.0.0 ist ja der Multicast Bereich. Heist dass, dass bei dir im Netz kein Server mit der Addr 224.0.0.150 vorhanden ist?
Und wenn jetzt ein weiterer Client den Channel auf 224.0.0.151 aufbauen würde, dann würde er die Packete des ersten Clients gar nicht berücksichtigen?

Und wie würde das aussehen, wenn man sowas übers Internet betreiben will? Multicast wird dort ja eh nicht weitergeroutet, oder?


Sorry für die Grundlagenfragen, aber ihrgenwie blick ich da gerade nicht ganz durch.


Gruss & Danke
jeipack
 
Hallo Thomas,

danke für deine Post's.. :)

Weißt du zufährlich wie kann ich Host spezifischen Informationen andseren Teilnehmen mitteilen!?
Z.B Ich möchte das jeder Host seine Name (HOST1, HOST2... etc.) anderen Teilnehmen mitteilt.
Muss ich ein Message dafür schreiben?

Momentan führe ich eine List von allen Hosts über ReceiverAdapter -> viewAccepted(View newView){ }

Aber die Informationen aus Addresse reichen mir nich aus [ip : port] :(

Danke für deine Hilfe!

Dima..
 
Zuletzt bearbeitet:
Zurück