3 Servidores 1 Cliente y 1 Coordinador con sockets por TCP/IP sin búfer en Java

26.10.08. Por ooscarr (ooscarr)

Siguiendo con esta serie de códigos java para la comunicación entre servidores, esta vez seguiré utilizando sockets pero ahora con la introducción de un quinto servidor que funcione como coordinador o proxy entre el cliente y los servidores encargados de las operaciones matemáticas.

Como dije, la única diferencia con el código anterior es que se ha introducido un servidor más entre el cliente y las operaciones como se muestra en la siguiente figura:

Cliente conectado a un Coordinador (5000) que se conecta a Raíz cuadrada (5001), logaritmo natural (5002) y potencia (5003)

El nuevo servidor Coordinador se comunicará con los demás por medio del puerto 5000, al igual como lo hacían los otros 3 servidores con el cliente anteriormente.

Códigos

Básicamente, lo que se hizo fue dividir el código Cliente.java del ejemplo anterior en 2:

Cliente.java
es el programa que se comunica con el usuario y proporciona la interfaz de comunicación con él.
Coordinador.java
que recibe los datos otorgados por Cliente.java, se comunica con el servidor correspondiente de cada operación para obtener el resultado y lo devuelve a Cliente.java para que se la muestre al usuario.

Los demás códigos:

...se mantienen igual.

Cliente.java

//Librería
import java.io.*;
import java.net.*;

public class Cliente{

 //Constructor
 public Cliente(){
 }
 
 /* Se definen cuatro variables que leen DESDE EL TECLADO
  stdin1 para saber si sigue o no
  stdin2 para saber qué función desea realizar
  stdin3 para obtener el valor que quiere resolver
  stdin4 para el exponente, en caso que desea resolver una potencia*/
 private static BufferedReader stdin1 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin2 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin3 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin4 = new BufferedReader(new InputStreamReader(System.in));
 
 //Función principal
 public static void main(String args[]) throws IOException{
  
  //Variable que guarda el nombre del servidor coordinador
  String IP_COORDINADOR="localhost";// con =null; también funciona
  //Variable que guarda el puerto del servidor cordinador
  int PUERTO_COORDINADOR=5000;
  
  //Por defecto sí sigue (empieza)
  String sigue="s";
  
  System.out.println("\nBuenos días");
  
  //Mientras el usuario siga con ganas de resolver
  while(sigue.equals("s")){
   // Menú
   System.out.println("\n¿Qué desea hacer?\n");
   System.out.println("1. Raíz cuadrada");
   System.out.println("2. Logaritmo natural");
   System.out.println("3. Potencia");
   System.out.println("\n4. Salir");
   System.out.print("\n- Ingrese su opcion: ");
   //Guardo opción en un string para evitar errores
   String opcion=stdin2.readLine();
   
   if(opcion.equals("1")){
    System.out.println("RAÍZ CUADRADA");
    try{
     
     //Lee el valor desde teclado
     System.out.print("Raíz cuadrada de: ");
     String valor=stdin3.readLine();
     
     //Envía el valor a la función de más abajo
     String resultado=realizar_operacion(IP_COORDINADOR,PUERTO_COORDINADOR,opcion,valor,null);
     
     //Imprime el resultado
     System.out.println("= "+resultado);

    } catch(Exception e){
     System.err.println(e);
    }
    
   }
   else if(opcion.equals("2")){
    System.out.println("LOGARITMO NATURAL");
    try{
     
     //Lee el valor desde teclado
     System.out.print("Logaritmo natural de: ");
     String valor=stdin3.readLine();
     
     //Envía el valor a la función de más abajo
     String resultado=realizar_operacion(IP_COORDINADOR,PUERTO_COORDINADOR,opcion,valor,null);
     
     //Imprime el resultado
     System.out.println("= "+resultado);
     
    } catch(Exception e){
     System.err.println(e);
    }

   }
   else if(opcion.equals("3")){
    System.out.println("POTENCIA");
    try{
     
     //Lee los valores desde teclado
     System.out.print("Base de la potencia: ");
     String base=stdin3.readLine();
     System.out.print("Exponente: ");
     String exponente=stdin4.readLine();
     
     //Envía el valor a la función de más abajo
     String resultado=realizar_operacion(IP_COORDINADOR,PUERTO_COORDINADOR,opcion,base,exponente);
     
     //Imprime el resultado
     System.out.println("= "+resultado);
     
    } catch(Exception e){
     System.err.println(e);
    }

   }
   else if(opcion.equals("4")){
    break;//Opción Salir
   }
   else{
    System.out.println("Se equivocó.");
    break;
   }
   
   //Sigue el ciclo
   System.out.print("\nDesea realizar otra operación? (s/n): ");
   sigue = stdin1.readLine();
  }
  
  System.out.println("Adios.");
 }
 
 
 /* Función realizar operacion se encarga de comunicarse con el coordinador*/
 static String realizar_operacion(String host,int puerto,String operacion,String valor1,String valor2){
  String respuesta=null;
  
  try {
   
   //System.out.print("Abriendo socket y creando flujos (streams)... ");
   Socket sockete = new Socket(host,puerto);
   //Creo dos canales de comunicación con la conexión
   DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(sockete.getOutputStream()));
   DataInputStream entrada = new DataInputStream(new BufferedInputStream(sockete.getInputStream()));
   //System.out.println("OK\n");
   
   //Primero digo qué operación deseo realizar
   salida.writeUTF(operacion);
   //Envío lo que hay en el canal de salida
   salida.flush();
   
   //Pongo el valor en el canal de salida
   salida.writeUTF(valor1);
   //Envío lo que hay en el canal de salida
   salida.flush();

   //Si desea hacer una potencia
   if(operacion.equals("3")){
    //Pongo el segundo valor en el canal de salida
    salida.writeUTF(valor2);
    //Envío lo que hay en el canal de salida
    salida.flush();
   }
   
   //Leo lo recibido como respuesta por el canal de entrada
   respuesta = entrada.readUTF();
   //System.out.println("Resultado="+respuesta);

   //Se cierra la petición de conexión llamada sockete
   try{
    sockete.close();
   } catch (Exception ex){}
   
  }
  catch(Exception e){
   System.err.println(e);
  }
  //Retorna el valor recibido como respuesta
  return respuesta;
 }
 
}

Coordinador.java

//Librería
import java.io.*;
import java.net.*;

public class Coordinador{
 //Constructor
 public Coordinador(){
 }

 //Función principal
 public static void main(String args[]) throws IOException{
  
  //Puerto que se abrirá en esta máquina para responder a los clientes
  int PUERTO_COORDINADOR=5000;
  
  //Variable que guarda el nombre del servidor de raíz cuadrada
  String IP_SQRT="localhost";// con =null; también funciona
  //Variable que guarda el puerto del servidor de raíz cuadrada
  int PUERTO_SQRT=5001;
  //Variable que guarda el nombre del servidor de logaritmo natural
  String IP_LN="localhost";
  //Variable que guarda el puerto del servidor de logaritmo natura
  int PUERTO_LN=5002;
  //Variable que guarda el nombre del servidor de potencias
  String IP_POTENCIA="localhost";
  //Variable que guarda el puerto del servidor de potencias
  int PUERTO_POTENCIA=5003;

  ServerSocket serverSocket=null;
  Socket socket=null;

  try{
   serverSocket =new ServerSocket(PUERTO_COORDINADOR);
  } catch (Exception e){
   System.err.println("Error al crear socket");
   return;
  }
  
  while (true){
   try{
    String respuesta="";
    
    System.out.println("Esperando la conexion de cliente ...");
    //Acepto una petición de conexión
    socket=serverSocket.accept();
    //Creo dos canales de comunicación con la conexión
    DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
    DataInputStream entrada = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

    //Recibo opción desde el cliente
    String operacion = entrada.readUTF();
    System.out.println(operacion);
    System.out.print("Esperando valor 1... ");
    //Recibo el valor desde el cliente
    String valor1 = entrada.readUTF();
    System.out.println(valor1);
    
    if(operacion.equals("1")){
     //Si quiere raíz cuadrada
     respuesta=realizar_operacion(IP_SQRT,PUERTO_SQRT,valor1,null);
    } else if(operacion.equals("2")){
     //Si quiere logaritmo natural
     respuesta=realizar_operacion(IP_LN,PUERTO_LN,valor1,null);
    } else if(operacion.equals("3")){
     //Si quiere potencia
     System.out.print("Esperando valor 2... ");
     //Recibo el exponente desde el cliente
     String valor2 = entrada.readUTF();
     System.out.println(valor2);
     respuesta=realizar_operacion(IP_POTENCIA,PUERTO_POTENCIA,valor1,valor2);
    } else{
     salida.writeUTF("Error. No está definida la operación solicitada.");
    }
    
    System.out.print("Enviando respuesta ("+respuesta+")... ");
    //La pongo en el canal de salida
    salida.writeUTF(respuesta);
    //Se envía
    salida.flush();
    System.out.println("OK");
    
    //Se cierra la petición de conexión llamada socket
    try{
     socket.close();
    } catch (IOException ex){}
    
   }
   catch (Exception e){
    System.err.println("Cerrando la conexion del socket ...");
    if(socket!=null){
     try{
      socket.close();
     }
     catch (IOException ex){}
    }
   }
  }
  
 }
 
 
 /* Función realizar operacion se encarga de comunicarse con el servidor*/
 static String realizar_operacion(String host,int puerto,String valor1,String valor2){
  String respuesta=null;
  
  try {
   
   //System.out.print("Abriendo socket y creando flujos (streams)... ");
   Socket sockete = new Socket(host,puerto);
   //Creo dos canales de comunicación con la conexión
   DataOutputStream salida = new DataOutputStream(new BufferedOutputStream(sockete.getOutputStream()));
   DataInputStream entrada = new DataInputStream(new BufferedInputStream(sockete.getInputStream()));
   //System.out.println("OK\n");
   
   //Pongo el valor en el canal de salida
   salida.writeUTF(valor1);
   //Envío lo que hay en el canal de salida
   salida.flush();

   //Si llega un cuarto argumento (el exponente de la potencia)
   if(valor2!=null){
    //Pongo el valor en el canal de salida
    salida.writeUTF(valor2);
    //Envío lo que hay en el canal de salida
    salida.flush();
   }
   
   //Leo lo recibido como respuesta por el canal de entrada
   respuesta = entrada.readUTF();
   //System.out.println("Resultado="+respuesta);

   //Se cierra la petición de conexión llamada sockete
   try{
    sockete.close();
   } catch (Exception ex){}
   
  }
  catch(Exception e){
   System.err.println(e);
  }
  //Retorna el valor recibido como respuesta
  return respuesta;
 }
 
}

Etiquetas: ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad