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