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

public class EchoServer{

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

				public EchoServer(){
								int port = 7777;
								try{

												/*
												 * Se crea el servidor y se le pone a la
												 * escucha en el puerto _port_
												 */
												
												ServerSocket server = new ServerSocket(port);
												System.out.println("Servidor a la escucha en el puerto: "+port);

												// Cuando hay una conexión lanza un nuevo hilo

												while(true) new EchoConnection(server.accept());
								}catch(Exception e){
												System.out.println("Error en el servidor.\n"+e.toString());
								}
				}
}

class EchoConnection extends Thread{

				public static int connections = 0, visits = 0;
				private Socket socket;

				public EchoConnection(Socket socket){
								this.socket = socket;
								this.start();
				}

				public void run(){
								
								//Maneja los datos de clientes activos y totales.
								
								EchoConnection.connections++;
								int numCliente = ++EchoConnection.visits;
								System.out.println("Conexión abierta con cliente número "+numCliente+".\n"+EchoConnection.connections+" usuarios conectados ahora");
								try{

												//Captura los flujos de entrada/salida
												
												BufferedReader entrada = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
												PrintWriter salida = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true);

												//Captura la entrada
												
												String cadena = entrada.readLine();
												System.out.println("Recibida cadena \""+cadena+"\" del usuario "+numCliente+".\n"+EchoConnection.connections+" usuarios conectados.");

												//Devuelve la cadena recibida
												
												salida.println(cadena);

                        //Cierra los flujos
                        
                        entrada.close();
                        salida.close();

												//Cierra el socket
												
												this.socket.close();

												System.out.println("Cerrada conexión con cliente "+numCliente+".\n"+EchoConnection.connections+" usuarios conectados.");
								}catch(Exception e){
												System.out.println("Ocurrió un error.\n"+e.toString());
								}finally{
												EchoConnection.connections--;
                }
                
				}
}
