public class ClientThread extends Thread {
private Socket so;
private BufferedReader vomClient;
private BufferedWriter zumClient;
private TicTacToeController controller;
private TicTacToeModel data;
public ClientThread(Socket so) throws IOException {
this.so = so;
this.data = new TicTacToeModel();
this.controller = new TicTacToeController(data);
}
private void sendToClient(String spec) throws Exception {
if (spec.equals("felder")){
zumClient.write(data.getFelderAsString());
}
else if (spec.equals("runde")){
zumClient.write(data.round);
}
else if (spec.equals("spiel")){
zumClient.write(data.getGames());
}
else if (spec.equals("gegenspieler")){
// Hier könnte noch ein Tokenizer benötigt werden
Player otherPlayer = data.getInactivePlayer();
zumClient.write(otherPlayer.name+" "+otherPlayer.color+" "+otherPlayer.active);
} else {
throw new Exception("Falsche Spezifikation des Kommandos GET");
}
}
private void processFromClient(StringTokenizer spec){
String next = spec.nextToken();
if (next.equals("feld")){
int feldIndex = Integer.parseInt(spec.nextToken());
int color = Integer.parseInt(spec.nextToken());
controller.updateFeld(feldIndex, color);
}
else if (next.equals("update-runde")){
data.round += 1;
}
else if (next.equals("update-spiel")){
data.addGame();
}
else if (next.equals("spieler")){
int color = Integer.parseInt(spec.nextToken());
// --- überprüfung der einzelnen Spieler Update Methoden
if (spec.hasMoreTokens()){
// Falls mehrere Rückgabewerte soll überprüft werden ob es ein true/ false ist oder der Name des Spielers (active und win update oder name update)
String checkActive = spec.nextToken();
if (checkActive.toLowerCase().equals("true") || checkActive.toLowerCase().equals("false")){
String checkWin = spec.nextToken();
boolean active;
boolean win;
// String Werte in boolean umwandeln
if (checkActive.toLowerCase().equals("true"))
active = true;
else
active = false;
// dasselbe für win
if (checkWin.toLowerCase().equals("true"))
win = true;
else
win = false;
// letztendlich methodenaufruf
controller.updateSpieler(color, active, win);
} else {
controller.updateSpieler(color, checkActive);
}
} else {
controller.updateSpieler(color);
}
}
}
private void waitForServer(BufferedReader vomClient) throws IOException {
while (!vomClient.ready()){
}
}
public void run(){
try {
vomClient = new BufferedReader(new InputStreamReader(so.getInputStream()));
zumClient = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
try {
while (true){
waitForServer(vomClient);
String kommandozeile = vomClient.readLine();
System.out.println("Folgende Befehl: "+kommandozeile+" wurde vom User mit der IP "+so.getLocalSocketAddress()+" abgesetzt");
StringTokenizer stok = new StringTokenizer(kommandozeile, " \r\n");
String cmd = stok.nextToken();
// Daten holen
if (cmd.equals("EMPFANGE")){
String spec = stok.nextToken();
sendToClient(spec);
// Daten Senden
} else if (cmd.equals("SENDE")){
processFromClient(stok);
} else if (cmd.equals("EXIT")){
so.shutdownOutput();
so.shutdownInput();
so.close();
zumClient.flush();
this.stop();
} else {
throw new Exception("Unknown Command");
}
}
} catch (Exception e){
e.printStackTrace();
System.out.println("Fehler!");
new PrintWriter(zumClient).println("Fehler");
}
zumClient.flush();
//so.close();
} catch (IOException e) {
e.printStackTrace();
}
}