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:
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:
Beispiel-Code 2:
Bemerkung; Die zwei Klassen werden verwendet, indem ein Thread mit einer Instanz der Klasse erzeugt wird und gestartet wird.
- 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.