Cliente/Servidor mediante sockets sin búfer por TCP/IP en Java

25.10.08. Por ooscarr (ooscarr)

Comunicar 2 computadores por socket es más o menos simple en java.

Ejemplo 1

En la U nos dieron este ejemplo con sockets para que los trabajáramos.

Cliente.java

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

class Cliente {
 
 static final String HOST = "localhost";
 static final int PUERTO=5000;
 
 public Cliente() {
  try{
   
   Socket skCliente = new Socket( HOST , PUERTO );
   
   InputStream aux = skCliente.getInputStream();
   
   DataInputStream flujo = new DataInputStream( aux );
   
   System.out.println( flujo.readUTF() );
   
   skCliente.close();
   
  } catch( Exception e ) {
   
   System.out.println( e.getMessage() );
  }
 }
 
 public static void main( String[] arg ) {
  new Cliente();
 }
}

Servidor.java

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

class Servidor {
 static final int PUERTO=5000;
 
 public Servidor() {
  
  try {
   
   ServerSocket skServidor = new ServerSocket( PUERTO );

   System.out.println("Escucho el puerto " + PUERTO );
   
   for ( int numCli = 0; numCli < 3; numCli++) {
    Socket skCliente = skServidor.accept(); // Crea objeto
    System.out.println("Sirvo al cliente " + numCli);
    OutputStream aux = skCliente.getOutputStream();
    DataOutputStream flujo= new DataOutputStream( aux );
 
    flujo.writeUTF( "Hola cliente " + numCli );

    skCliente.close();
   }
   
   System.out.println("Demasiados clientes por hoy");

  } catch( Exception e ) {
   System.out.println( e.getMessage() );
  }
 }
 
 public static void main( String[] arg ) {
  new Servidor();
 }
}

Calculadora científica

Combinando el ejemplo anterior y el código de las funciones en la clase Operaciones de un artículo anterior, queda lo siguiente:

Cliente.java

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

public class Cliente{
 //Constructor
 public Cliente(){
 }
 
 /* Se definen dos variables que leen DESDE EL TECLADO
  stdin1 para saber si sigue o no
  stdin2 para obtener el valor que quiere resolver */
 private static BufferedReader stdin1 = new BufferedReader(new InputStreamReader(System.in));
 private static BufferedReader stdin2 = 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;
  
  //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")){
  
   try{
    
    System.out.println("RAÍZ CUADRADA");
    
    //Lee el valor desde teclado
    System.out.print("Raíz cuadrada de: ");
    String valor=stdin2.readLine();
    
    //Envía el valor a la función de más abajo
    String resultado=realizar_operacion(IP_SQRT,PUERTO_SQRT,valor);
    
    //Imprime el resultado
    System.out.println("= "+resultado);
    
   } catch(Exception e){
    System.err.println(e);
   }

   //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 valor){
  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(valor);
   //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;
 }

}

Servidor.java

//
//  Servidor.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
*/

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

public class Servidor{
 //Constructor
 public Servidor(){
 }
 
 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.println("Bienvenido");
    //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){}
    }
   }
  }
 }
}

Pronto más.

Referencias

Etiquetas: ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad