package ChatServer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Tato třída ukazuje implementaci
 * jednoduchého Chatovacího serveru.
 * Celá logika serveru je opět umístěna
 * v
 * těle metody main.
 * 
 * @author JAIR
 */
public class ChatServer {
 public static void main(String args[]) {
  // Proměnná "pozdrav". Tato zpráva se
  // zobrazí na straně klientské třídy v
  // okamžiku, kdy dojde k připojení
  // klienta na server.
  String greetings = "Hi you are just connected";
  try {
   // Inicializuji (někdy říkáme
   // otevírám) objekt ServerSocket. Ten
   // bude otevřen na stanici, na které
   // je bude spuštěna tato třída.
   // Definuji port, na kterém bude
   // tento ServerSocket poslouchat a
   // přijímat či odesílat zprávy dle
   // potřeby.
   ServerSocket srvr = new ServerSocket(
     1234);
   // Inicializuji objekt Socket. Ten
   // zaregistrovávám pomocí metody
   // accept() na příslušný
   // ServerSocket. Pokud vše dopadne
   // korektně, zobrazím v konzoli
   // ChatServeru hlášku: Server has
   // connected!. V opačném případě
   // systém vrací výjimku definovanou
   // na konci metody main v těle catch.
   Socket skt = srvr.accept();
   System.out
     .print("Server has connected!\n");

   // Otevírám výstupní proud dat.
   // Odesílám pozdrav klientské straně.
   // Ta obdrží informaci, že je
   // korektně připojena na server a
   // může tak začít posílat jednotlivé
   // zprávy.
   PrintWriter out = new PrintWriter(
     skt.getOutputStream(), true);
   // Pozdrav vypíši do logu (konzole)
   // ChatServeru. Je dobré vědět zda
   // došlo k nějakému problému během
   // připojování klienta či vše
   // proběhlo bez potíží. Uvědom si, že
   // pracujeme již s Klient - Server
   // architekturou. Klient může být
   // fyzicky běžící na jiném počítači a
   // není v jeho silách zjistit, proč
   // se připojení nezdařilo. V tom
   // případě kontaktuje administrátora.
   // Ten pak potřebuje v logu
   // ChatServeru nalézt pokud možno co
   // největší množství informací o
   // průběhu relace, aby mohl zjednat
   // nápravu.
   System.out.print("Sending string: '"
     + greetings + "'\n");
   out.println(greetings);
   // Definuji vstupní prou dat. Vstup
   // získávám opět (jako u klientské
   // části) pomocí metody
   // getInputStream() nad otevřeným
   // objektem Socket.
   BufferedReader in = new BufferedReader(
     new InputStreamReader(
     skt.getInputStream()));
   // Definuji pomocnou proměnnou.
   String inputLine;

   // V cyklu načítám vstupní proud dat
   // a pokud není null (tzn. přišla
   // nějaká zpráva) pak...
   while ((inputLine = in.readLine()) != null) {
    // pokud je v něm Bye, pak si klient
    // přeje relaci ukončit, vrátím mu
    // jeho řetězec zpět slušnou
    // odpovědí Bye
    if (inputLine
      .equalsIgnoreCase("Bye")) {
     out.println(inputLine);
    }
    else {
     // a pokud v něm není řetězec Bye
     // přidám zprávě řetězec Akcepted
     // on server side. Tím oznamuji, že
     // server přijal zprávu. V tomto
     // příkladu není přidané větší
     // množství logiky. Jednak z důvodu
     // jednoduchosti pochopení a též
     // proto, že tento blok budeme
     // rozpracovávat později. Můžeš si
     // jej ale rozpracovat dle libosti
     // napřed.
     out
       .println("Akcepted on server side: "
         + inputLine);
     // Řetězec si vypíši na terminál,
     // ve kterém je spuštěn ChatServer.
     System.out
       .println(" Server received: "
       + inputLine);

    }

   }
   // Na konec uzavírám jednotlivé
   // otevřené vstupní a výstupní
   // proudy. Na to nezapomínej. Je to
   // velmi důležité. Pokud na ně
   // zapomeneš, může se stát, že bude
   // mít tvůj program velké problémy s
   // pamětí, při delším běhu.
   out.close();
   skt.close();
   srvr.close();

  }
  catch (Exception e) {
   System.out
     .print("Server didn't work!\n");
  }
 }

}
