3 Servidores 1 Cliente con sockets en Java

25.10.08. Por ooscarr (ooscarr)

Con sockets, es fácil comunicar programas en java hasta con diferentes servidores.

Crearé un cliente que realiza las 3 operaciones: raíz cuadrada, logritmo natural y potencia; pero ahora distribuyéndolas en 3 servidores diferentes, uno para cada operación.

Un cliente se comunica con 3 servidores: Raíz cuadrada, logaritmo natural y potencia

Como, en mi caso, ejecutaré los 4 códigos en una misma máquina, he decidido asignarle a cada operación un puerto:

  • Puerto 5001 para la raíz cuadrada
  • Puerto 5002 para el logaritmo natural
  • Puerto 5003 para resolver las potencias

Códigos

La conexión mediante sockets ya la conocemos, así que vamos directamente a cómo quedan los códigos al distribuirlos.

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 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;
  
  //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_SQRT,PUERTO_SQRT,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_LN,PUERTO_LN,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_POTENCIA,PUERTO_POTENCIA,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 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;
 }
 
}

Sqrt.java

//
//  Sqrt.java
//  
/* Esta clase
 1. Abre un puerto
 2. Acepta una conexión
 3. Recibe un String
 4. Envía la raíz cuadrada del String
 5. Cierra la conexión
*/
//
//  Created by Oscar on 16-10-08.
//

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

public class Sqrt{
 //Constructor
 public Sqrt(){
 }
 
 public static void main (String[] args){
  //Puerto que se abrirá en esta máquina para responder a los clientes
  int PUERTO_SQRT=5001;
  
  Socket socket=null;
  ServerSocket serverSocket=null;
  
  try{
   serverSocket =new ServerSocket(PUERTO_SQRT);
  }
  catch (Exception e){
   System.err.println("Error al crear socket");
   return;
  }
  //Mientras el programa esté funcionando
  while (true){
   try{
    System.out.println("Esperando para resolver raíces cuadradas ...");
    //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()));
    
    //System.out.print("Esperando valor... ");
    
    //Recibo el valor desde el cliente
    String valor = entrada.readUTF();
    
    //Creo el objeto con las operaciones definidas
    Operaciones operar=new Operaciones(valor);
    
    System.out.print("Raíz cuadrada de "+valor+" es... ");
    //Realizo la operación
    String resultado=String.valueOf(operar.sqrt());
    System.out.println(resultado);
    
    //La pongo en el canal de salida
    salida.writeUTF(resultado);
    System.out.print("Enviando 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){}
    }
   }
  }
 }
}

Ln.java

//
//  Ln.java
//  
/* Esta clase
 1. Abre un puerto
 2. Acepta una conexión
 3. Recibe un String
 4. Envía el logaritmo natural del String
 5. Cierra la conexión
*/
//
//  Created by Oscar on 16-10-08.
//

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

public class Ln{
 //Constructor
 public Ln(){
 }
 
 public static void main (String[] args){
  //Puerto que se abrirá en esta máquina para responder a los clientes
  int PUERTO_LN=5002;
  
  Socket socket=null;
  ServerSocket serverSocket=null;
  
  try{
   serverSocket =new ServerSocket(PUERTO_LN);
  }
  catch (Exception e){
   System.err.println("Error al crear socket");
   return;
  }
  //Mientras el programa esté funcionando
  while (true){
   try{
    System.out.println("Esperando para resolver logaritmos naturales...");
    //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()));
    
    //System.out.print("Esperando valor... ");
    
    //Recibo el valor desde el cliente
    String valor = entrada.readUTF();
    
    //Creo el objeto con las operaciones definidas
    Operaciones operar=new Operaciones(valor);
    
    System.out.print("ln("+valor+") = ");
    //Realizo la operación
    String resultado=String.valueOf(operar.ln());
    System.out.println(resultado);
    
    //La pongo en el canal de salida
    salida.writeUTF(resultado);
    System.out.print("Enviando 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){}
    }
   }
  }
 }
}

Potencia.java

//
//  Potencia.java
//  
/* Esta clase
 1. Abre un puerto
 2. Acepta una conexión
 3. Recibe dos Strings
 4. Envía el valor del primer String
    elevado a la potencia del segundo String.
 5. Cierra la conexión
*/
//
//  Created by Oscar on 16-10-08.
//

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

public class Potencia{
 //Constructor
 public Potencia(){
 }
 
 public static void main (String[] args){
  //Puerto que se abrirá en esta máquina para responder a los clientes
  int PUERTO_POTENCIA=5003;
  
  Socket socket=null;
  ServerSocket serverSocket=null;
  
  try{
   serverSocket =new ServerSocket(PUERTO_POTENCIA);
  }
  catch (Exception e){
   System.err.println("Error al crear socket");
   return;
  }
  //Mientras el programa esté funcionando
  while (true){
   try{
    System.out.println("Esperando para resolver potencias...");
    //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()));
    
    //System.out.print("Esperando valor... ");
    
    //Recibo el valor1 desde el cliente
    String valor1 = entrada.readUTF();
    //Recibo el valor2 desde el cliente
    String valor2 = entrada.readUTF();
    
    //Creo el objeto con las operaciones definidas
    Operaciones operar=new Operaciones(valor1,valor2);
    
    System.out.print(valor1+"^"+valor2+" = ");
    //Realizo la operación
    String resultado=String.valueOf(operar.potencia());
    System.out.println(resultado);
    
    //La pongo en el canal de salida
    salida.writeUTF(resultado);
    System.out.print("Enviando 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){}
    }
   }
  }
 }
}

Etiquetas: ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad