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.

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){}
}
}
}
}
}


0 comentarios (RSS
) :
Referencias a este artículo:
Página principal