import java.net.*;
import java.io.*;
import java.util.*;
public class cliente {

  static Conexao c;
  static Socket socket;
  static Vector table = new Vector();
  
  String server=" ";
  String binder="localhost";
  int server_port;
  int binder_port=5001;
  static String servico="";
  static int servidor_ativo;  


  // inicialização do cliente
  public cliente(String servico)
  {
    int indice=-1;
    String aux;
    // chama a funcao que verifica se o cliente possui a identificacao do servidor
    if(table.size()>0) // se ha alguma coisa na tabela
      indice = verifica_servidor(); // retorna o indice do servico na tabela
    ////////////
    if ( indice == -1 )             // não sabe onde está o serviço
    {
       System.out.println("nao sei onde esta o servico");
       if ( request_service(servico) == 0 )  // se não houver servidores disponíveis
       {
          System.out.println("Não há servidores disponíveis para executar o serviço");
          servidor_ativo=-1; // para identificar que nao achou o servico
          System.exit(0);
       }
    }else  // sabe onde esta o servico
    {
        System.out.println("Eu sei onde estah o servico");
   	  aux=(String)table.elementAt(indice);
        define_server(aux);
    }
    try 
    {
       socket = new Socket(server,server_port);
    }
    catch (Exception e)
    {
       System.out.println("Nao consegui resolver o host...");
       servidor_ativo=-1; // para identificar que nao achou o servico
       if(indice != -1)  // eu tinha o servico na tabela
       { 
	      table.remove(indice);  // remove o servidor da tabela
	   
         for(int p=0;p<50000;p++)
	      {	
         }
	
         if(request_service(servico) == 0) // se nao houver servidores disponiveis
	      {
           System.out.println("Não há servidores disponíveis para executar o serviço");
           servidor_ativo=-1; // para identificar que nao achou o servico 
           System.exit(0); 
         }
         // tentando se conectar com o servidor novamente 
         try 
         {
           socket = new Socket(server,server_port);
         }
         catch (Exception e1)
         {
           System.out.println("Nao consegui resolver o host denovo...");
           System.exit(0);
           servidor_ativo=-1; // para identificar que nao achou o servico
         }
      }  
   }
}
  
public int verifica_servidor()  // funcao que verifica se o servico esta na tabela
{
   String ajuda;
   int saida=-1; 
   for (int i=0; i<table.size(); i++)
   {
     ajuda = (String)table.elementAt(i);
     if(servico.compareTo(ajuda.substring(0,ajuda.indexOf("|"))) == 0) 
 	  {
        saida=i;
        i=table.size()+1;
     }
   }
   //  System.out.println("Saida: "+saida); 
   return saida;
}

  public int request_service(String servico)
  {
    String resp;
    Socket bs;
    int retorno=0;             // retorna 1 se achou o serviço e 0 se não achou 
    int num,num1;
    String converte="";
    try
    {
      bs = new Socket(binder, binder_port);
      c.send(bs,"1|"+servico+"|");
      resp = c.receive(bs);
      if (resp.compareTo("Erro") != 75)
      {   
        table.add(resp.substring(0,resp.lastIndexOf("|")+1));
  	     define_server(resp);
        retorno = 1;
      }   
    }
    catch(Exception e)
    {
      System.out.println("Erro na criação do socket para requisição do serviço "+e.getMessage());
    }
    return(retorno);
  }

  public void define_server(String inter)  // define o server e o server_port
  {
     int num, num1;
     StringTokenizer linha = new StringTokenizer(inter,"|");
     server = linha.nextToken();
     server = linha.nextToken();
     num=inter.indexOf("|");
     server_port = Integer.parseInt(linha.nextToken());
     servidor_ativo=1;
  }

  public static void main(String args[])
  {
     String msg = " ";
     int x,y,cont;
     x=6;
     y=3;
     msg=x+"|"+y+"|";
     servico="soma_x_y";
     
     cont=0;
     while(cont<50)
     {
        try
        {
	    // soma
           msg=x+"|"+y+"|";
           servico="soma_x_y";
           new cliente(servico);
           if(servidor_ativo == 1) // se ele achou o servidor
	        {
              c.send(socket,msg);
              msg = c.receive(socket);
              System.out.println("Resultado da Soma de 6 e 3: "+msg);
           }
           // mult
           msg=x+"|"+y+"|";
           servico="mult_x_y";   
           new cliente(servico);
           if(servidor_ativo == 1) // se ele achou o servidor
      	  {
              c.send(socket,msg);
              msg = c.receive(socket);
              System.out.println("Resultado da Mult de 6 e 3: "+msg);
           }
           //subt
           msg=x+"|"+y+"|";
           servico="subt_x_y";
           new cliente(servico);
           if(servidor_ativo == 1) // se ele achou o servidor
           {
              c.send(socket,msg);
              msg = c.receive(socket);
              System.out.println("Resultado da Subt de 6 e 3: "+msg);
           }
        }

        catch (Exception e)
        {
          System.out.println("Excecao no receber a mensagem");
        }
        cont++;
     }    
  }
}
