package controller.net;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.nio.ByteBuffer;
import common.Log;
import controller.action.net.SPLCoachMessageReceived;
import data.SPLCoachMessage;
public class SPLCoachMessageReceiver extends Thread
{
private static SPLCoachMessageReceiver instance;
private final DatagramSocket datagramSocket;
private SPLCoachMessageReceiver() throws SocketException
{
datagramSocket = new DatagramSocket(null);
datagramSocket.setReuseAddress(true);
datagramSocket.setSoTimeout(500);
datagramSocket.bind(new InetSocketAddress(SPLCoachMessage.SPL_COACH_MESSAGE_PORT));
}
public synchronized static SPLCoachMessageReceiver getInstance()
{
if (instance == null) {
try {
instance = new SPLCoachMessageReceiver();
} catch (SocketException e) {
throw new IllegalStateException("fatal: Error while setting up Receiver.", e);
}
}
return instance;
}
@Override
public void run()
{
while (!isInterrupted()) {
try {
final ByteBuffer buffer = ByteBuffer.wrap(new byte[SPLCoachMessage.SIZE]);
final DatagramPacket packet = new DatagramPacket(buffer.array(), buffer.array().length);
datagramSocket.receive(packet);
buffer.rewind();
final SPLCoachMessage coach = new SPLCoachMessage();
if (coach.fromByteArray(buffer)) {
new SPLCoachMessageReceived(coach).actionPerformed(null);
}
} catch (SocketTimeoutException e) { // ignore, because we set a timeout
} catch (IOException e) {
Log.error("something went wrong while receiving the coach packages : " + e.getMessage());
}
}
datagramSocket.close();
}
}