Escolar Documentos
Profissional Documentos
Cultura Documentos
04 - RMI-Aula - Pratica - N - 2 - Resolucao
04 - RMI-Aula - Pratica - N - 2 - Resolucao
04 - RMI-Aula - Pratica - N - 2 - Resolucao
1. Descrição
Para este exercício foi necessário a criação de uma interface TTTService que estende a Classe
Remota que disponibiliza a assinatura de todos os métodos implementados pelo objeto TTT que
representa o jogo, de forma que possa ser manipulado remotamente por um cliente, mesmo
que a Classe TTT e o objeto concreto se encontrem instanciados apenas no lado do servidor.
Para isso, o TTTServer ao ser executado, cria uma instância concreta de um objeto ttt e faz o seu
registro no diretório Java Names, no nosso caso, na porta 8080 do localhost.
Depois disso, o programa TTTClient tenta ler o nome do diretório, um objeto remoto que
responde à assinatura presente na interface TTTService, assim que a geração de um proxy
permite a interação com o objeto remoto ignorando detalhes da sua implementação.
Foi adicionado um método int lastPlay (int player), implementado na classe concreta TTT como
uma função que, obtendo o jogador retorna o último movimento feito por ele (para cada um
dos jogadores 2) ou retornando -1 se nenhum movimento foi feito pelo respetivo jogador. Este
método remoto é invocado quando o jogador escreve 10 como um lance, tendo para sua
validação alterado o leque de movimentos possíveis na lógica do jogo.
A solução também implementa um método restart () que permite reinicializar o tabuleiro logo
assim que um jogo termine.
2. Classes
As classes que foram implementadas para o acesso remoto ao jogo TTT são as seguintes:
1
5. Listagem do Código
O programa do jogo é composto pelos seguintes ficheiros:
Game.java
import java.util.Scanner;
import java.rmi.RemoteException;
}
} while (play > 9 || play < 0);
return play;
}
do {
player = ++player % 2;
do {
System.out.println(ttt.currentBoard());
play = readPlay();
if (play != 0) {
playAccepted = ttt.play( --play / 3, play % 3, player);
if (!playAccepted)
System.out.println("Invalid play! Try again.");
} else
playAccepted = false;
} while (!playAccepted);
winner = ttt.checkWinner();
} while (winner == -1);
}
2
public void congratulate() throws RemoteException{
if (winner == 2)
System.out.printf("\nHow boring, it is a draw\n");
else
System.out.printf(
"\nCongratulations, player %d, YOU ARE THE
WINNER!\n",
winner);
ttt.restart();
}
}
TTT.java
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
import java.util.LinkedList;
3
public int getColumn(){
return column;
}
public int getPlayer(){
return player;
}
}
if (numPlays == 9)
return false;
4
if((board[i][0] == board[i][1] && board[i][0] == board[i][2])) {
if (board[i][0]=='X')
return 1;
else
return 0;
}
numPlays--;
Plays.removeLast();
}
}
}
}
TTTServer.java
import java.io.IOException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
System.out.println("Main OK");
5
try {
TTTService tttGame = new TTT();
System.out.println("After create");
reg.rebind("TTTService", tttGame);
System.out.println("Rebind OK");
} catch(Exception e) {
System.out.println("TTT server main " + e.getMessage());
}
}
}
TTTService.java
import java.rmi.*;
TTTClient.java
import java.rmi.*;