@Override
    public void run() {
        Object comandoDoCliente;
        Object retornoParaCliente;

        isAlive = true;
        while (isAlive) {
            try {
                comandoDoCliente = getObjectLido();

                if (comandoDoCliente != null) {

                    if (comandoDoCliente instanceof Mensagem) {
                        logger.debug("Comandos do Cliente: " + comandoDoCliente.toString());
                        logarMensagem("Comandos do Cliente: " + comandoDoCliente.toString());

                        retornoParaCliente = (Object) comandosCliente.parseMensagem(comandoDoCliente);

                        logger.debug("Comandos para o Cliente: " + retornoParaCliente.toString());
                        logarMensagem("Comandos para o Cliente: " + retornoParaCliente.toString());
                        if (!enviaParaCliente(retornoParaCliente)) {
                            logger.debug("Erro enquanto envia para o cliente");
                            logarMensagem("Erro enquanto envia para o cliente");

                        }

                    } else if (inFromCliente.read() == -1) {//conexao fechou
                        logger.debug("Cliente fechou a conexao");
                        logarMensagem("Cliente fechou a conexao");
                        isAlive = false;
                        break;
                    } else {
                        logger.debug("Recebeu comando do Cliente null");
                        logarMensagem("Recebeu comando do Cliente null");
                        isAlive = false;
                        break;
                    }
                }

                recebeDoCliente();
                
            } catch (EOFException ex) {
                logger.log(Level.INFO, "Cliente fechou a conexao");
                logarMensagem("Cliente fechou a conexao");
                isAlive = false;
            } catch (IOException ex) {
                logger.log(Level.ERROR, "Erro na conexao com o cliente", ex);
                logarMensagem("Erro na conexao com o cliente");
                isAlive = false;
            } catch (ClassNotFoundException ex) {
                logger.log(Level.ERROR, "Erro na conversao do objeto mensagem recebido do ciente", ex);
                logarMensagem("Erro na conversao do objeto mensagem recebido do ciente");
                isAlive = false;
            }
        }

        try {
            fecharConexao(); //encerra tudo
        } catch (IOException ex) {
            logger.log(Level.ERROR, "Erro na conexao com o cliente", ex);
            logarMensagem("Erro na conexao com o cliente");
        }
    }