domingo, 19 de julio de 2015

Servidor Multihilo con Java

Un servidor multihilo es aquel que puede aceptar muchas solicitudes simultaneas. Ésta entrada describe un servidor multihilo simple implementado en Java. Para hacerlo basta con implementar un Servidor con sockets de la forma tradicional y agregar una pequeña modificación. Ahora usaremos el método ssock.accept()  de la clase Socket y el método MultiThreadServer(socketname) de la calse ServerSocket.


import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MultiThreadServer implements Runnable {
   Socket csocket;
   MultiThreadServer(Socket csocket) {
      this.csocket = csocket;
   }

   public static void main(String args[]) 
   throws Exception {
      ServerSocket ssock = new ServerSocket(1234);
      System.out.println("Escuchando");
      while (true) {
         Socket sock = ssock.accept();
         System.out.println("Conectado");
         new Thread(new MultiThreadServer(sock)).start();
      }
   }
   public void run() {
      try {
         PrintStream pstream = new PrintStream
         (csocket.getOutputStream());
         for (int i = 100; i >= 0; i--) {
            pstream.println(i + 
            " Hola");
         }
         pstream.close();
         csocket.close();
      }
      catch (IOException e) {
         System.out.println(e);
      }
   }


Ventajas de un servidor Multihilo

Las ventajas se pueden resumir en dos aspectos:
1.Peticiones de clientes que duran mucho, no bloquean el servidor.
2.Se gasta menos tiempo afuera de la llamada de accept()

Un un servidor de un solo hilo. Los clientes que toman mucho tiempo podrian provocar que el servidor no responda por un largo periodo de tiempo, esto no sucede para un servidor multihilo.

Para establecer la conexión requerimos de nuestro cliente. Este es el codigo fuente tomar en cuenta el ingreso de argumentos en Socket().


public static void main(String[] args) throws IOException {

        //Socket para establecer conexion
        Socket cliente = new Socket(args[0], Integer.parseInt(args[1]));
        //Enlazar entrada de datos con UN FLUJO
        BufferedReader lecturaCliente=new BufferedReader(new InputStreamReader(cliente.getInputStream()));
        //Entrada de datos de usuario
        BufferedReader lecturaTeclado=new BufferedReader(new InputStreamReader(System.in));
           
        //Enlazar salida de datos con un flujo
        PrintWriter escrituraCliente=new PrintWriter(cliente.getOutputStream(),true);
        //variable String para alamcenar mensaje recibido
        String mensajeEnviar =new String();
        //escuchar por mensajes
        while((mensajeEnviar=lecturaTeclado.readLine())!=null){
            //System.out.println("Mensaje devuelto" + mensajeEnviar);
            escrituraCliente.println(mensajeEnviar);
        }
        cliente.close();
        
    }

}