package com.rzg.zombieland.cliente.comunicacion; import java.io.IOException; import java.net.Socket; import com.rzg.zombieland.cliente.comunicacion.controlador.ControladorClienteFactory; import com.rzg.zombieland.comunes.comunicacion.HiloEscucha; import com.rzg.zombieland.comunes.comunicacion.HiloListener; import com.rzg.zombieland.comunes.comunicacion.Peticion; import com.rzg.zombieland.comunes.misc.Log; import com.rzg.zombieland.comunes.misc.ZombielandException; /** * Singleton que mantiene una conexi�n constante con el servidor. * @author nicolas * */ public class ServicioCliente implements HiloListener { // El hilo de escucha en s�. private HiloEscucha hiloEscucha; // Esta clase es un singleton. private static ServicioCliente instancia; // Escuchador del hilo. private static HiloListener listenerHilo; /** * Constructor privado para uso de crearInstancia. * @param puerto * @param host * @throws ZombielandException */ private ServicioCliente(int puerto, String host) throws ZombielandException { try { hiloEscucha = new HiloEscucha(new Socket(host, puerto), new ControladorClienteFactory()); hiloEscucha.addListener(this); hiloEscucha.start(); } catch(IOException e) { throw new ZombielandException("No se pudo realizar la conexi�n con el servidor: " + e.getLocalizedMessage()); } } /** * @return el hilo de escucha. */ public HiloEscucha getHiloEscucha() { return hiloEscucha; } /** * Inicializa una instancia de ServicioCliente. * @param puerto - el puerto en el que se abre la conexi�n. * @param host - el FQDN del servidor. * @throws ZombielandException si ocurre alg�n error de conexi�n. */ public static void crearInstancia(int puerto, String host) throws ZombielandException { instancia = new ServicioCliente(puerto, host); } /** * @return la instancia de ServicioCliente cargada �ltima, o null si no se carg� ninguna. */ public static ServicioCliente getInstancia() { return instancia; } /** * M�todo de convenienvia para enviar una petici�n al hilo de escucha que subyace al * ServicioCliente. * @param peticion * @throws ZombielandException */ public static void enviarPeticion(Peticion<?, ?> peticion) throws ZombielandException { getInstancia().getHiloEscucha().enviarPeticion(peticion); } /** * Cierra el servicio cliente, limpiando todos los recursos que inicializ�. */ public static void cerrar() { instancia.hiloEscucha.cerrar(true); try { instancia.hiloEscucha.join(); } catch (InterruptedException e) { Log.error("Interrumpido mientras se esperaba que el hilo escucha se cerrara."); Log.error(e.getLocalizedMessage()); } instancia = null; } /** * Establece el escuchador de eventos de conexi�n. * @param listener */ public static void setListener(HiloListener listener) { listenerHilo = listener; } @Override public void hiloCerrado(HiloEscucha hilo) { Log.info("Se cerr� la conexi�n con el servidor"); if (listenerHilo != null) listenerHilo.hiloCerrado(hilo); } }