package visualiser.gameController; import mock.model.RaceLogic; import network.BinaryMessageDecoder; import network.Exceptions.InvalidMessageException; import network.MessageDecoders.BoatActionDecoder; import network.Messages.BoatAction; import network.Messages.Enums.BoatActionEnum; import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; import java.util.logging.Level; import java.util.Observable; import java.util.logging.Logger; /** * Service for dispatching key press data to race from client */ public class ControllerServer extends Observable implements Runnable { /** * Socket to client */ private Socket socket; /** * Wrapper for input from client */ private DataInputStream inputStream; /** * Last received boat action */ private BoatActionEnum action; /** * Initialise server-side controller with live client socket * @param socket to client * @param race logic loop observing controls */ public ControllerServer(Socket socket, RaceLogic race) { this.socket = socket; this.addObserver(race); try { this.inputStream = new DataInputStream(this.socket.getInputStream()); } catch (IOException e) { e.printStackTrace(); } } public BoatActionEnum getAction() { return action; } /** * Wait for controller key input from client and loop. */ @Override public void run() { while(true) { byte[] message = new byte[20]; try { if (inputStream.available() > 0) { inputStream.read(message); BinaryMessageDecoder encodedMessage = new BinaryMessageDecoder(message); BoatActionDecoder boatActionDecoder = new BoatActionDecoder(); try { boatActionDecoder.decode(encodedMessage.getMessageBody()); BoatAction boatAction = boatActionDecoder.getMessage(); action = boatAction.getBoatAction(); // Notify observers of most recent action this.notifyObservers(); this.setChanged(); } catch (InvalidMessageException e) { Logger.getGlobal().log(Level.WARNING, "Could not decode BoatAction message.", e); } } } catch (IOException e) { e.printStackTrace(); } } } }