package io.muoncore.discovery.multicast;
import io.muoncore.InstanceDescriptor;
import io.muoncore.ServiceDescriptor;
import io.muoncore.codec.json.GsonCodec;
import io.muoncore.transport.ServiceCache;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Arrays;
public class MulticastClient extends Thread {
private boolean running = true;
private ServiceCache serviceCache;
private GsonCodec codec;
public MulticastClient(ServiceCache serviceCache) {
super("Muon Multicast Discovery Client");
this.serviceCache = serviceCache;
this.codec = new GsonCodec();
}
public void run() {
try {
MulticastSocket socket = new MulticastSocket(MulticastDiscovery.PORT);
socket.setReuseAddress(true);
socket.setLoopbackMode(true);
InetAddress address = InetAddress.getByName(MulticastDiscovery.MULTICAST_ADDRESS);
socket.joinGroup(address);
DatagramPacket packet;
while(running) {
byte[] buf = new byte[512];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
byte[] data = Arrays.copyOfRange(buf, 0, packet.getLength());
InstanceDescriptor descriptor = codec.decode(data, ServiceDescriptor.class);
System.out.println("Got data " + descriptor.getIdentifier());
serviceCache.addService(descriptor);
}
socket.leaveGroup(address);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void shutdown() {
running = false;
}
}