package netzprog01_j_ultimate;

import java.io.IOException;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Daniel Leese
 */
public class Sockenschuss {

    MulticastSocket multiSocket = null;
    InetAddress targetAddress = null;
    private static Sockenschuss instance = null;
    int port = 61312;
    String progKey = new String("012345678");
    String clientKey = new String("");
    java.util.Random rand = null;
    int min = 10000, max = 99999;
    Integer randNumber;

    private Sockenschuss() {
        rand = new java.util.Random();
        randNumber = min + Math.abs(rand.nextInt()) % (max - min + 1);
        clientKey = randNumber.toString();
        try {

            multiSocket = new MulticastSocket(port);
            targetAddress = InetAddress.getByName("224.0.0.1");
            multiSocket.joinGroup(targetAddress);

        } catch (IOException ex) {
            Logger.getLogger(Sockenschuss.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    /**
     * Wenn noch keine Instanz von Sockenschuss existiert werd einen neue erzeugt.
     * @return Instanz Adresse
     */
    public static Sockenschuss getInstance() {
        if (instance == null) {
            instance = new Sockenschuss();
        }
        return instance;
    }

    /**
     * Sendent das Uebergebene Object toSend
     * @param toSend Object das gesendet werden soll
     */
    void send(String toSend) {
        String toSendHelp = progKey + "|" + clientKey + "|" + toSend;
        DatagramPacket hi = new DatagramPacket(toSendHelp.toString().getBytes(), toSendHelp.toString().length(), targetAddress, port);
        try {

            this.multiSocket.send(hi);

        } catch (IOException ex) {
            Logger.getLogger(Sockenschuss.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Gibt ein empfangenes DatagramPacket zuruck.
     * @return Ein empfangenes DatagramPacket.
     */
    public DatagramPacket receive() {
        byte[] buf = new byte[1000];
        DatagramPacket recv = new DatagramPacket(buf, buf.length);
        try {

            multiSocket.receive(recv);

        } catch (IOException ex) {
            Logger.getLogger(Sockenschuss.class.getName()).log(Level.SEVERE, null, ex);
        }

        return recv;
    }
}