Estoy haciendo un cliente-servidor en java de un juego, en el cual el servidor captura dos clientes y va intercambiando las jugadas respectivas del juego entre ellos. Todo bien hasta ahí, pero yo quiero que cuando un tercer cliente se intente conectar le devuelva un error de que solo se admiten dos clientes. Hasta el momento lo único que he podido hacer es que el tercer cliente se quede esperando infinitamente, pero yo lo que quiero es que lance un error. Espero que alguien me pueda dar una sugerencia de como podría hacer eso
Este es el código que estoy usando para el servidor
Código:
import java.awt.BorderLayout; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Formatter; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class Servidor extends JFrame { private String[] areaJuego1 = new String[81]; private String[] areaJuego2 = new String[81]; private Jugador[] jugadores; private ServerSocket servidor; private int jugadorActual; private final static int JUGADOR_1 = 0; private final static int JUGADOR_2 = 1; private final static String[] TURNOS = {"1", "2"}; private ExecutorService iniciarJuego; private Lock lock; private Condition otroJugadorConectado; private Condition otroJugadorTurno; private boolean tableroCompletado1 = false; private boolean tableroCompletado2 = false; private JTextArea areaTexto; private int oportunidadesRestantes1 = 2/*15*/; private int oportunidadesRestantes2 = 2/*15*/; private int jugadoresListos = 0; public Servidor() { super("Servidor"); iniciarJuego = Executors.newFixedThreadPool(2); System.out.println("Servidor: iniciado Ejecutor"); lock = new ReentrantLock(); System.out.println("Servidor: iniciado Lock"); otroJugadorConectado = lock.newCondition(); otroJugadorTurno = lock.newCondition(); for (int i = 0; i < areaJuego1.length; i++) { areaJuego1[i] = ""; } for (int y = 0; y < areaJuego2.length; y++) { areaJuego2[y] = ""; } System.out.println("Servidor: iniciadas Areas de juego"); jugadores = new Jugador[2]; jugadorActual = JUGADOR_1; try { servidor = new ServerSocket(12345, 2); } catch (IOException ex) { ex.printStackTrace(); System.exit(1); } System.out.println("Servidor: iniciado servidor"); areaTexto = new JTextArea(); add(areaTexto, BorderLayout.CENTER); areaTexto.setText("Servidor Esperando Conexiones\n"); System.out.println("Servidor: iniciada interfaz"); setSize(300, 300); setVisible(true); } public void execute() { while (true) { try { if (jugadoresListos < 2) { jugadores[jugadoresListos] = new Jugador(servidor.accept(), jugadoresListos, false); iniciarJuego.execute(jugadores[jugadoresListos]); System.out.println("Servidor: Capturando Clientes"); jugadoresListos++; if (jugadoresListos == jugadores.length) { lock.lock(); try { jugadores[JUGADOR_1].setSuspendido(false); otroJugadorConectado.signal(); } finally { lock.unlock(); } } } else { Jugador temp = new Jugador(servidor.accept(), 0, true); iniciarJuego.execute(temp); } } catch (IOException ex) { ex.printStackTrace(); System.exit(1); } } // for (int i = 0; i < jugadores.length; i++) { // try { // jugadores[i] = new Jugador(servidor.accept(), i, false); // iniciarJuego.execute(jugadores[i]); // System.out.println("Servidor: Capturando Clientes"); // } catch (IOException ex) { // ex.printStackTrace(); // System.exit(1); // } // } // lock.lock(); // try { // jugadores[JUGADOR_1].setSuspendido(false); // otroJugadorConectado.signal(); // } finally { // lock.unlock(); // } } private boolean juegoTerminado() { if (oportunidadesRestantes1 == 0 || oportunidadesRestantes2 == 0) { return true; } else { return false; } } public void mostrarMensaje(final String mensaje) { SwingUtilities.invokeLater( new Runnable() { public void run() { areaTexto.append(mensaje); System.out.println("Servidor: Mostrado Mensaje"); } }); } public boolean validarJugada(int ubicacion, int jugador) { while (jugador != jugadorActual) { lock.lock(); try { otroJugadorTurno.await(); } catch (InterruptedException ex) { ex.printStackTrace(); } finally { lock.unlock(); } System.out.println("Servidor: Jugador Esperando"); } if (estaOcupado(ubicacion, jugador)) { jugadorActual = (jugadorActual + 1) % 2; jugadores[jugadorActual].movidaOtroJugador(ubicacion); lock.lock(); try { otroJugadorTurno.signal(); } finally { lock.unlock(); } return true; } else { jugadorActual = (jugadorActual + 1) % 2; jugadores[jugadorActual].movidaOtroJugador(ubicacion); lock.lock(); try { otroJugadorTurno.signal(); } finally { lock.unlock(); } return false; } } /** * * Recibe una ubicacion y el numero de jugador * Si la ubicacion tiene un "1" quiere decir esta ubicada y se puede * destruir por lo que el valor de la ubicacion se cambia a "0", devuelve un * "true" * Si la ubicacion tiene un "0" quiere decir que ya habia algo pero * se destruyo, devuelve un "false" * Si tiene un "" quiere decir que nunca ha habido nada por lo que devuelve * un "false" * El numero de jugador se utiliza para decidir cual area de juego utilizar */ public boolean estaOcupado(int location, int jugador) { boolean salida = false; if (jugador == JUGADOR_1) { if (areaJuego2[location].equals("1")) { salida = true; areaJuego2[location] = "0"; oportunidadesRestantes1 = oportunidadesRestantes1 - 1; System.out.println("Servidor: Nave Destruida"); } } if (jugador == JUGADOR_2) { if (areaJuego1[location].equals("1")) { salida = true; areaJuego1[location] = "0"; oportunidadesRestantes2 = oportunidadesRestantes2 - 1; System.out.println("Servidor: Nave Destruida"); } } System.out.println("Servidor: Jugada Valida"); return salida; }