24.8 Juego de Tres en raya (Gato) tipo cliente/servidor, utilizando un servidor con subprocesamiento...
1021
1
// Fig. 24.13: ServidorTresEnRaya.java
2
// Esta clase mantiene un juego de Tres en raya para dos clientes.
3
import
java.awt.BorderLayout;
4
import
java.net.ServerSocket;
5
import
java.net.Socket;
6
import
java.io.IOException;
7
import
java.util.Formatter;
8
import
java.util.Scanner;
9
import
java.util.concurrent.ExecutorService;
10
import
java.util.concurrent.Executors;
11
import
java.util.concurrent.locks.Lock;
12
import
java.util.concurrent.locks.ReentrantLock;
13
import
java.util.concurrent.locks.Condition;
14
import
javax.swing.JFrame;
15
import
javax.swing.JTextArea;
16
import
javax.swing.SwingUtilities;
17
18
public class
ServidorTresEnRaya
extends
JFrame
19
{
20
private
String[] tablero =
new
String[
9
];
// tablero de tres en raya
21
private
JTextArea areaSalida;
// para imprimir los movimientos en pantalla
22
private
Jugador[] jugadores;
// arreglo de objetos Jugador
23
private
ServerSocket servidor;
// socket servidor para conectarse con los clientes
24
private
int jugadorActual;
// lleva la cuenta del jugador que sigue en turno
25
private final static int
JUGADOR_X
=
0
;
// constante para el primer jugador
26
private final static int
JUGADOR_O
=
1
;
// constante para el segundo jugador
27
private final static String
[] MARCAS = {
"X"
,
"O"
};
// arreglo de marcas
28
private
ExecutorService ejecutarJuego;
// ejecuta a los jugadores
29
private
Lock bloqueoJuego;
// para bloquear el juego y estar sincronizado
30
private
Condition otroJugadorConectado;
// para esperar al otro jugador
31
private
Condition turnoOtroJugador;
// para esperar el turno del otro jugador
32
33
// establece servidor de tres en raya y GUI para mostrar mensajes en pantalla
34
public
ServidorTresEnRaya()
35
{
36
super
(
"Servidor de Tres en raya"
);
// establece el título de la ventana
37
38
// crea objeto ExecutorService con un subproceso para cada jugador
39
ejecutarJuego = Executors.newFixedThreadPool(
2
);
40
bloqueoJuego =
new
ReentrantLock();
// crea bloqueo para el juego
Figura 24.13
| Lado servidor del programa Tres en raya cliente/servidor. (Parte 1 de 6).
24.8 Juego de Tres en raya (Gato) tipo cliente/servidor, utilizando
un servidor con subprocesamiento múltiple
En esta sección presentaremos el popular juego de Tres en raya (Gato o Tic-Tac-Toe), que implementaremos
mediante el uso de las técnicas cliente/servidor con sockets de fl ujo. El programa consiste en una aplicación
Tres-
EnRaya
(fi guras 24.13 y 24.14) que permite a dos aplicaciones
ClienteTresEnRaya
(fi guras 24.15 y 24.16)
conectarse al servidor y jugar Tres en raya. En la fi gura 24.17 se muestran pantallas de ejemplo de la salida de este
programa.
La clase ServidorTresEnRaya
A medida que el
ServidorTresEnRaya
recibe la conexión de cada cliente, crea una instancia de la clase interna
Jugador
(líneas 182 a 304 de la fi gura 24.13) para procesar al cliente en un subproceso separado. Estos subproce-
sos permiten a los clientes jugar en forma independiente. El primer cliente que se conecta al servidor es el jugador
X y el segundo es el jugador O. El jugador X realiza el primer movimiento. El servidor mantiene la información
acerca del tablero, para poder determinar si el movimiento de un jugador es válido o inválido.
24_MAQ_CAP_24_Deiltel.indd1021
4/19/081:34:59AM