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