Cliente Servidor número secreto

CLIENTE

CLASE PRINCIPAL

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketcliente_multiples;

/**
 *
 * @author glop
 */
public class Socketcliente_multiples {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       
        clientes cliente = new clientes(); // Instancia que representa un cliente
        cliente.start(); // Se inicia el hilo del cliente. Ya se encargará el servidor de asignarle un id
    }
}












CLASE HILO CLIENTES




/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketcliente_multiples;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 *
 * @author glop
 */
public class clientes extends Thread {
   
    public clientes() {
       
    }
   
   
    @Override
    public void run() {
        BufferedReader lector  = new BufferedReader(new InputStreamReader(System.in)); // Buffer que lee lo escrito por cliente
        try {
        Socket socket = new Socket("localhost",2000); // Se crea el socket del cliente con la conexión local y el puerto 2000
        System.out.println("Conectado");
       
        // Buffers de entrada y salida de datos. Necesarios para la comunicaciones entre el cliente y el servidor
        DataOutputStream salida = new DataOutputStream (socket.getOutputStream());
        DataInputStream entrada = new DataInputStream (socket.getInputStream());
       
        int numeroCliente=-1; // Variable que almacena el número introducido por el cliente. Al iniciarse el juego es -1
        int correcto = -1; // Variable que indica si se ha acertado el número. Al iniciarse es -1
        int intentos=0; // Variable que contabiliza los intentos
       
        System.out.println("Intenta averiguar el número secreto"); // Presentación del juego
       
        while(correcto!=1) { // Sigo pidiento datos al cliente hasta que el servidor envíe el 1 que es la clave
                             // de que ha acertado
            numeroCliente=-1; // Se resetea el valor del número del cliente
            while(numeroCliente==-1) { // Comprueba que es un número válido
            try {
                System.out.println("¿Número?"); // Pido el número
                numeroCliente = Integer.parseInt(lector.readLine()); // Lo guardo en una variable numérica
                   
            } catch (Exception ex) { // Si no es un número válido me lanza un error y vuelve a pedirlo
                System.out.println("No es un número válido");
            }
            }
            salida.writeInt(numeroCliente); // Envío lo que recibo por teclado
            correcto=entrada.readInt(); // Recibo la respuesta del servidor
            if (correcto==0) { // Si recibo un 0 es que el número es menor
                System.out.println("El número secreto es menor a " + numeroCliente);
            } else if (correcto==2) { // Si recibo un 2 es que el número es mayor
                System.out.println("El número secreto es mayor a " + numeroCliente);
            }
            intentos++; // Se contabiliza un nuevo intento
        }
       
        // Como ya he salido del while, he ganado y lo comunico al cliente
        System.out.println("Efectivamente, el número secreto es " + numeroCliente);
        System.out.println("¡¡EL JUEGO HA TERMINADO LO HAS CONSEGUIDO EN " + intentos +  " INTENTOS!!");
        System.out.println("Desconectando conexión ...");
       
        // Se cierra el socket y los flujos
        entrada.close();
        salida.close();
        socket.close();
      
        } catch (Exception ex) { // Si ocurriera alguna excepción, la capturo e informo
            System.out.println("Ocurrio un error en la comunicación con el servidor");
    }
    }
}

SERVIDOR

CLASE PRINCIPAL

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketservidor_multiples;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 *
 * @author glop
 */
public class servidor extends Thread {
   
    private Socket cliente;
    private int id;
    DataOutputStream salida;
    DataInputStream entrada;
   
    public servidor(Socket sock, int idd) {
        this.cliente = sock;
        this.id = idd;
       
       
        try {

       
       
        // Buffers de entrada y salida de datos. Necesarios para la comunicaciones entre el cliente y el servidor
        salida = new DataOutputStream (cliente.getOutputStream());
        entrada = new DataInputStream (cliente.getInputStream());
       
       
        } catch (Exception ex) {
       
        }
    }

        @Override
        public void run() {
        System.out.println("El cliente " + id + " está jugando");
        Random aleatorio = new Random(); // Generador de números aleatorios
        int n = aleatorio.nextInt(100); // Variable que almacena un número de 0 a 100
        int numeroCliente = -1; // Variable que almacena el número que me manda el cliente
        try {
         // Hasta que el número que me envíe el cliente no sea el número secreto, sigo comparándolos
        // y no dejo que la comunicación acabe
        while (n!=numeroCliente) {
            numeroCliente = entrada.readInt(); // Recibo el número de la parte del cliente
            if (numeroCliente>n) {
                salida.writeInt(0); // Le indico que es menor mediante el envío de un 0
               
            }
            if (numeroCliente<n) {
                salida.writeInt(2); // Le indico que es mayor mediante el envío de un 2
               
            }
           
        }
           
        salida.writeInt(1); // Le indico que el número es correcto mediante el envío de un 1
        // Como ya he salido del while, he ganado, se lo indico mandando un 1 que es la clave.
        System.out.println("¡¡EL CLIENTE " + id +  " HA ACERTADO!!");
        System.out.println("Desconectando conexión con el cliente " + id + " ...");
        cliente.close(); // Cierro cliente
    } catch (Exception ex) { // Si ocurriera algún error, lo capturo e informo
        System.out.println("Ocurrio un error en la comunicación con el cliente " + id);
   
}
    }
   
}

CLASE HILO SERVIDOR

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package socketservidor_multiples;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 *
 * @author glop
 */
public class servidor extends Thread {
   
    private Socket cliente;
    private int id;
    DataOutputStream salida;
    DataInputStream entrada;
   
    public servidor(Socket sock, int idd) {
        this.cliente = sock;
        this.id = idd;
       
       
        try {

       
       
        // Buffers de entrada y salida de datos. Necesarios para la comunicaciones entre el cliente y el servidor
        salida = new DataOutputStream (cliente.getOutputStream());
        entrada = new DataInputStream (cliente.getInputStream());
       
       
        } catch (Exception ex) {
       
        }
    }

        @Override
        public void run() {
        System.out.println("El cliente " + id + " está jugando");
        Random aleatorio = new Random(); // Generador de números aleatorios
        int n = aleatorio.nextInt(100); // Variable que almacena un número de 0 a 100
        int numeroCliente = -1; // Variable que almacena el número que me manda el cliente
        try {
         // Hasta que el número que me envíe el cliente no sea el número secreto, sigo comparándolos
        // y no dejo que la comunicación acabe
        while (n!=numeroCliente) {
            numeroCliente = entrada.readInt(); // Recibo el número de la parte del cliente
            if (numeroCliente>n) {
                salida.writeInt(0); // Le indico que es menor mediante el envío de un 0
               
            }
            if (numeroCliente<n) {
                salida.writeInt(2); // Le indico que es mayor mediante el envío de un 2
               
            }
           
        }
           
        salida.writeInt(1); // Le indico que el número es correcto mediante el envío de un 1
        // Como ya he salido del while, he ganado, se lo indico mandando un 1 que es la clave.
        System.out.println("¡¡EL CLIENTE " + id +  " HA ACERTADO!!");
        System.out.println("Desconectando conexión con el cliente " + id + " ...");
        cliente.close(); // Cierro cliente
    } catch (Exception ex) { // Si ocurriera algún error, lo capturo e informo
        System.out.println("Ocurrio un error en la comunicación con el cliente " + id);
   
}
    }
   
}