Multicast-Nachrichten-Empfang funktioniert nicht

baba27

Mitglied
Ich wollte eigentlich ein Programm schreiben, um Multicast-Nachrichten zu empfangen, aber leider scheinen keine Nachrichten empfangen zu werden. Ich habe auch verschiedene Beispiele aus dem Internet ausprobiert mit DatagrammSocket oder MulticastSocket oder DatagrammChannel. Folgende mögliche Ursachen sind mir in den Sinn gekommen:

  • Firewall (habe ich aber testweise ausgeschaltet)
  • SecurityPolicy (ich habe ein Policy-Datei erstellt und beim Start an die VM übergeben und es tritt zumindest kein Fehler auf)

Aus diesem Grund bin ich etwas ratlos, wo ich noch suchen soll. Das Senden von Nachrichten funktioniet und kann mit tcpdump angezeigt werden, weshalb es auch nicht an fehlenden Nachrichten liegen sollte.

Beispiel-Code 1:
Java:
class UdpListener implements Runnable {
        private final int port;
      
        public UdpListener(int port) {
            this.port = port;
        }
      
        @Override
        public void run() {
            while (true) {             
                MulticastSocket socket = null;
                try {
                    socket = new MulticastSocket(null);
                    InetAddress group = InetAddress.getByName("224.0.0.251");
                    socket.joinGroup(group);
                    socket.setReuseAddress(true);
                  
                    socket.bind(new InetSocketAddress("0.0.0.0",port));
                    System.out.println("Listener bound to port "+socket.getLocalPort()+" and address "+socket.getLocalAddress().getHostAddress());
                                      
                    byte buf[] = new byte[4096];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
                    socket.receive(dp);
                    if (dp.getLength()>0) {
                        buf = dp.getData();
                        System.out.println("- received data: "+new String(buf, 0, dp.getLength()));
                    }
                } catch (SocketException e) {                 
                    e.printStackTrace();
                    try {
                        Thread.sleep(100l);
                    } catch (InterruptedException e1) {                     
                    }
                } catch (IOException e) {                 
                    e.printStackTrace();
                    try {
                        Thread.sleep(100l);
                    } catch (InterruptedException e1) {                     
                    }
                } finally {
                    if (socket!=null && !socket.isClosed())  {                     
                        socket.close();
                    }
                }
            }
        }
    }

Beispiel-Code 2:
Java:
class MulticastReceiver implements Runnable {
    private static final String MULTICAST_INTERFACE = "wlp4s0";
    private final String MULTICAST_IP = "224.0.0.251";
        
    private final int multicastPort;
        
    public MulticastReceiver(int port) {
       this.multicastPort = port;
    }
        
    private String receiveMessage() throws IOException {
        DatagramChannel datagramChannel = DatagramChannel.open(StandardProtocolFamily.INET);
            
        NetworkInterface networkInterface = NetworkInterface.getByName(MULTICAST_INTERFACE);
            
        datagramChannel.setOption(StandardSocketOptions.SO_REUSEADDR, true);
        datagramChannel.bind(new InetSocketAddress(multicastPort));
        datagramChannel.setOption(StandardSocketOptions.IP_MULTICAST_IF, networkInterface);
            
        InetAddress inetAddress = InetAddress.getByName(MULTICAST_IP);
        MembershipKey membershipKey = datagramChannel.join(inetAddress, networkInterface);
            
        System.out.println("Waiting for the message...");
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        datagramChannel.receive(byteBuffer);
        byteBuffer.flip();
        byte[] bytes = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes, 0, byteBuffer.limit());
        membershipKey.drop();
            
        return new String(bytes);
    }

    @Override
    public void run() {
        while (true) {
            try {
                System.out.println(receiveMessage());
            } catch (IOException e) {
                e.printStackTrace();
  
                try {
                    Thread.sleep(100l);
                } catch (InterruptedException e1) {                     
                }
            }             
        }         
    }     
}

Bemerkung; Die zwei Klassen werden verwendet, indem ein Thread mit einer Instanz der Klasse erzeugt wird und gestartet wird.
 

baba27

Mitglied
Die Firewall als Ursache kann ich definitiv ausschliessen. Sowohl TCP-Dump als auch ein Python-Programm, das auf ankommende Nachrichten hört, erhalten die Nachrichten. Allerdings erhält Python nicht alle Nachrichten, die ankommen. Zum Teil liegt es wohl am Betriebssystem.
 

baba27

Mitglied
Der Code war nur zum Testen da, um herauszufinden, ob ich bestimmte Multicast-Nachrichten empfangen kann, und definitiv nicht perfekt. Leider war der Versuch nicht erfolgreich und ich habe im Moment eine andere Lösung gefunden, die ohne Multicast-Nachrichten auskommt. Eigentlich wollte ich Nachrichten des Zeroconf-Protokolls emfangen, um herauszufinden, wo ein bestimmter Service liegt. Eine andere Möglichkeit wäre den avahi-Dämon abzufragen. Leider wird aber mein Service nicht registriert. Vielleicht weil es kein Standard-Service ist. Deswegen habe ich den Router so konfiguriert, dass es dem Gerät, das den Service anbietet, immer dieselbe IP-Adress zuweist und konfiguriere die IP-Adresse in meinem Programm. Ich implementiere vielleicht später eine bessere Lösung, die mit dem Zeroconfig-Protokoll zurecht kommt.
 

Jw456

Top Contributor
Hi habe mir den Code von Post #1 noch mal angesehen.
Zeile 13 da erstellest du ein Multicast Objekt wo du keinen Port angibst. Null ist hier nicht gut.

Verstehe auch nicht was du in Zeile 18 mit dem bind willst. Da würdest du ja den UTP DatagramSocket eine andere IP Adresse geben das macht für mich keinen sinn.

Für mich kein wunder wenn da nicht ankommt.

 

Jw456

Top Contributor
PS auch das lesen (überschreiben ) des Buffers ist für mich nicht richtig.
Zeile 25 " buf = dp.getData();" da veränderst du ja den Buffer benutze einen neuen String und nicht den Buffer.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
N Multicast Adresse herausfinden des PCs Netzwerkprogrammierung 11
B Socket Liste von clients - multicast Netzwerkprogrammierung 4
P Fehlererkennung bei UDP Multicast Netzwerkprogrammierung 2
L Multicast Netzwerkprogrammierung 5
Kr0e Broadcast, Multicast, IPv4,6 ? Netzwerkprogrammierung 2
D Multicast geht nur auf einem Rechner Netzwerkprogrammierung 9
L Multicast im Internet? Netzwerkprogrammierung 3
T DataOutputStream Nachrichten werden fehlerhaft gesendet. Netzwerkprogrammierung 1
L Socket Nachrichten senden Netzwerkprogrammierung 3
Creylon Socket Mehrere gleichzeitig eingehende Nachrichten Netzwerkprogrammierung 8
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
S javamail und filterung bekannter nachrichten Netzwerkprogrammierung 3
J Nach Dateiversand werden keine Nachrichten mehr übertragen Netzwerkprogrammierung 11
B Socket NIO-Server/Client-Abgeschnittene Nachrichten (Strings) Netzwerkprogrammierung 6
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
T Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem Netzwerkprogrammierung 3
S ICQ Nachrichten abhöhren Netzwerkprogrammierung 4
S Knuddels Chat System: Bot / Nachrichten verschicken? Netzwerkprogrammierung 6
B Nachrichten-Polling? Netzwerkprogrammierung 5
B Nachrichten über das Netzwerk verschicken Netzwerkprogrammierung 3
A Thread gibt Nachrichten mehrmals aus (Messenger in Java) Netzwerkprogrammierung 3
S Server mit mehreren Clients Nachrichten austauschen Netzwerkprogrammierung 6
D Rückmeldung bei Empfang Netzwerkprogrammierung 14

Ähnliche Java Themen

Neue Themen


Oben