Documentação
- Capítulo 5.5 Java RMI do livro principal da cadeira
(Coulouris "Distributed Systems: Concepts and Design")
Enunciado
Partindo de um Jogo do Galo (Tic Tac Toe) feito para um cenário
local, pretende-se desenvolver uma variante do jogo onde a parte
computacionalmente mais pesada é realizada por um servidor remoto.
Sugestão: nas alíneas seguintes, corra cliente e servidor
numa máquina não partilhada com outros grupos, para evitar conflitos
com outros grupos (ou seja, use a máquina do laboratório e não o
sigma).
- Descarregue e descomprima o código fonte da aplicação Jogo
do Galo/Tic Tac Toe
(servidor
, cliente
).
- Importe o projecto no eclipse, seguindo
os passos aqui indicados.
- Estude os principais ficheiros do pacote com a
implementação do jogo (Game.java e TTT.java).
- Compile e experimente o jogo (pelo Eclipse ou executando mvn
package appassembler:assemble seguido de
target\appassembler\bin\ttt-rmi-server numa consola exterior
ao Eclipse).
- Pretende-se que a classe TTT.java, que implementa o
jogo, passe a ser invocável remotamente.
Dessa forma,
permitir-se-á que haja um cliente remoto (que possivelmente corre em
máquina diferente que a máquina que serve o jogo) que interage com
os jogadores e que invoca as funções do servidor via Java RMI
(Remote Method Invocation).
- Comece por desenhar a interface remota do servidor numa
interface chamada TTTService. A interface deve expor
todas as funções remotas que o cliente precisa de invocar. Para
ser uma interface remota, precisa também de herdar de java.rmi.Remote
e cada um dos seus métodos deve lançar uma java.rmi.RemoteException.
Consulte o exemplo de interface
remota apresentado no livro para ajuda.
- Transforme a classe TTT para que passe a
implementar a interface remota TTTService. Para que
instâncias desta classe possam ser objectos remotos, modifique a
definição da classe TTT para que ela passe a herdar de java.rmi.server.UnicastRemoteObject
e acrescente um construtor que lance excepção RemoteException.
Consulte o exemplo da classe
shapeListServant apresentado no livro para ajuda.
- No projecto servidor, crie uma nova classe com método main,
onde correrá o servidor.
No método main deverá:
- Instanciar um objecto remoto do tipo TTT
- Lançar um rmiregistry (serviço de nomes do RMI) e
registar o objecto remoto nesse rmiregistry
Consulte o exemplo da classe
ShapeListServer apresentado no livro para ajuda.
Não se
esqueça de actualizar o ficheiro pom.xml.
- Abra agora o ficheiro fonte da classe ttt.Client.
- Baseando-se na classe ttt.Game do projecto do servidor,
implemente um cliente remoto que, com base nos comandos recebidos
pela consola local, invoca métodos do jogo remoto. Assuma que
ambos os jogadores de cada jogo usam o mesmo cliente.
Consulte o exemplo do cliente
apresentado no livro para ajuda.
- Não se esqueça de na chamada ao método Naming.lookup,
definir correctamente o URL que localiza o objecto, na forma: //host:port/name,
em que host e port definem a máquina e o porto
onde corre o rmiregistry (respectivamente) onde foi
registado o objecto remoto e name é o nome que foi
atribuído ao objecto pelo servidor quando chamou rebind.
- Adicione o tratamento adequado às excepções lançadas quando acontece
algo inesperado numa invocação remota. (Algumas das excepções que podem
ocorrer são: java.rmi.UnknownHostException, java.rmi.UnmarshalException,
java.rmi.MarshalException, java.rmi.RemoteException e
java.rmi.ConnectException)
- Experimente lançar o servidor e depois um cliente para jogar.
- Responda às seguintes questões:
- Quando se usa SUN RPC é gerado código para converter os
dados de e para um formato de rede. O que acontece quando se usa
RMI?
- Das classes e interfaces Java que usou, quais as que
pertencem apenas ao cliente, apenas ao servidor e a ambos?
O resto do enunciado será entregue na aula. O objectivo será
estender a solução resultante do enunciado acima com mais
procedimentos ou modificar alguns dos seus procedimentos actuais.
Entrega da solução
Fénix, Avaliação, Projetos, mini Exercício 2 - Java RMI
A solução completa deverá ser submetida no Fénix antes do fim
da sua aula de laboratório.
Trabalhos submetidos depois da
hora de fim da aula não serão considerados.
Ter atenção ao seguinte:
- Só serão aceites trabalhos de estudantes que estiveram
presentes no laboratório.
- Assegure-se que a solução é enviada em formato ZIP e que não
contém código compilado.
(faça mvn clean antes de
zipar)
- Deverá incluir um ficheiro respostas.txt com as
respostas às perguntas do enunciado do exercício.
- Deverá também incluir um ficheiro instrucoes.txt
com resumo da funcionalidade implementada e com instruções para
colocar o programa a funcionar como esperado.
Por exemplo:
- A funcionalidade pedida foi total/parcialmente implementada
...
- Para compilar: mvn compile
- O servidor deve executar com o seguinte comando:
./target/appassembler/bin/ttt-rmi-server
- O cliente deve executar com o comando: ./target/appassembler/bin/ttt-rmi-client
localhost