
// ScoreServer.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Sekvenční server, jenž uchovává skóre (a jméno) klientů
   v seznamu 10 nejvyšších bodů.

   Rozumí vstupní zprávě ve tvaru:
		get					   -- vrací seznam nejvyšších skóre
        score name & score &   -- přidá skóre pro dané jméno
		bye					   -- ukončí spojení s klientem

   Seznam udržuje v souboru SCORFN a při startu jej načítá.
   Server lze ukončit kombinací klávec CTRL a C.
*/

import java.io.*;
import java.net.*;
import java.util.*;


public class ScoreServer
{
  private static final int PORT = 1234;
  private HighScores hs;
  
  public ScoreServer()
  // V nekonečné cyklu sekvenčně zpracovává klienty
  {
    hs = new HighScores();
    try {
      ServerSocket serverSock = new ServerSocket(PORT);
      Socket clientSock;
      BufferedReader in;     // vstupně/výstupní buffer pro server
      PrintWriter out;

      while (true) {
        System.out.println("Čekám na klienta...");
        clientSock = serverSock.accept();
        System.out.println("Spojení od klienta z adresy " + 
				clientSock.getInetAddress().getHostAddress() );

        // Získej V/V proudy ze socket
        in  = new BufferedReader( 
		  		new InputStreamReader( clientSock.getInputStream() ) );
        out = new PrintWriter( clientSock.getOutputStream(), true );  // autoflush

        // komunikuj s klientem
        processClient(in, out);
 
        // Uzavři spojení s klientem
        clientSock.close();
        System.out.println("Spojení s klientem uzavřeno\n");
        hs.saveScores();      // backup high scores after each client has finished
      }
    }
    catch(Exception e)
    {  System.out.println(e);  }
  }  // konec metody: ScoreServer()


   private void processClient(BufferedReader in, PrintWriter out)
   // Zastaví, když se uzavře vstupní proud (je null) nebo když přišla zpráva "bye"
   // Jinak předá vstupní zprávu metodě doRequest()
   {
     String line;
     boolean done = false;
     try {
       while (!done) {
         if((line = in.readLine()) == null)
           done = true;
         else {
           System.out.println("Zpráva od klienta: " + line);
           if (line.trim().equals("bye"))
             done = true;
           else 
             doRequest(line, out);
         }
       }
     }
     catch(IOException e)
     {  System.out.println(e);  }
   }  // konec metody: processClient()


  private void doRequest(String line, PrintWriter out)
  /*  Vstupní řádek může vypadat buď takto:
             "score name & score &"
      nebo takto:
            "get"
  */
  {
    if (line.trim().toLowerCase().equals("get")) {
      System.out.println("Zpracovávám 'get'");
      out.println( hs.toString() );
    }
    else if ((line.length() >= 6) &&     // "score "
        (line.substring(0,5).toLowerCase().equals("score"))) {
      System.out.println("Zpracovávám 'score'");
      hs.addScore( line.substring(5) );    // odřízni klíčové slovo score
    }
    else
      System.out.println("Ignoruji vstupní řádek");
  }  // konec metody: doRequest()


  // ------------------------------------

  public static void main(String args[]) 
  {  new ScoreServer();  }

} // konec třídy: ScoreServer

