Si observamos la siguiente figura, cuando un servidor recibe la conexión del cliente (accept
) se crea el socket del cliente, se realiza el envío y recepción de datos y se cierra el socket del cliente finalizando la ejecución del servidor.
Como el objetivo es permitir que múltiples clientes utilicen el servidor de forma simultánea es necesario que la parte que atiende al cliente (zona coloreada de azul) se atienda de forma independiente para cada uno de los clientes.
Para ello, en vez de ejecutar todo el código del servidor de forma secuencial, vamos a tener un bucle while
para que cada vez que se realice la conexión de un cliente se cree una hebra de ejecución (thread) que será la encargada de atender al cliente. De ésta forma, tendremos tantas hebras de ejecución como clientes se conecten a nuestro servidor de forma simultánea.
De forma resumida, el código necesario es:
while(true){
// Se conecta un cliente
Socket skCliente = skServidor.accept();
System.out.println("Cliente conectado");
// Atiendo al cliente mediante un thread
new Servidor(skCliente).start();
}
Y a continuación puede ver su representación de forma gráfica: