/**
 * @version     001.01
 * @date        20/jan/2003
 * @author      Luiz H Celeguim
 * @description Servidor tipo echo multi-thread
 */

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

public class ThreadedServer
{  public static void main(String[] args )
   {  int i = 1;
      try
      {  ServerSocket s = new ServerSocket(8080);
         System.out.println("Socket criado: "+s);

         for (;;)
         {  Socket incoming = s.accept( );
            System.out.println("Servindo thread " + i);
            new ThreadedEchoHandler(incoming, i).start();
            i++;
         }
      }
      catch (Exception e)
      {   System.out.println("Erro no servidor...");
          e.printStackTrace();
      }
   }
}

class ThreadedEchoHandler extends Thread
{  public ThreadedEchoHandler(Socket i, int c)
   { incoming = i; counter = c; }

   public void run()
   {  try
      {

          System.out.println("Criando thread...");
          System.out.println("socket recebido: "+incoming);
          System.out.println("contador recebido: "+counter);

          BufferedReader in = new BufferedReader
            (new InputStreamReader(incoming.getInputStream()));

          System.out.println("Buffered Reader criado: "+in);

          PrintWriter out = new PrintWriter (
              new BufferedWriter(new OutputStreamWriter(incoming.getOutputStream())), true /* autoFlush */);

          System.out.println("PrintWriter criado "+out);

          out.println("Bem vindo ao servidor. Digite BYE para sair.");

         boolean done = false;
         while (!done)
         {  String str = in.readLine();
            if (str == null) done = true;
            else
            {  out.println("Thread (" + counter + "): " + str);

               System.out.println("Linha recebida: "+str.trim());
               if (str.trim().equals("BYE"))
                  done = true;
            }
         }

         incoming.close();
      }
      catch (Exception e)
      {  System.out.println("Erro na thread do servidor...");
         e.printStackTrace();
      }
   }

   private Socket incoming;
   private int counter;
}

