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