Sistemas Distribuídos SuDoku Informações sobre o documento Tabela de revisões Versão Autores Descrição Data 1.0 Hugo João Gomes Nuno Rafael Figueiredo Implementação do Campeonato de SuDoku (com chat) 19/10/2005 2.0 Hugo João Gomes Nuno Rafael Figueiredo Comunicação em Java RMI. Integração com Servidor TCP. 31/10/2005 3.0 Hugo João Gomes Nuno Rafael Figueiredo Comunicação via HTTP com Servlets. Integração com Servidor RMI. 16/11/2005 841068998 -1- Sistemas Distribuídos SuDoku Índice Informações sobre o documento ________________________________________ 1 Tabela de revisões____________________________________________________ 1 Índice ______________________________________________________________ 2 Introdução __________________________________________________________ 3 Regras do jogo SuDoku ____________________________________________________ 3 Chat _____________________________________________________________________ 3 Ranking __________________________________________________________________ 3 Planeamento do projecto ___________________________________________________ 3 Versão UDP + TCP _______________________________________________________ 3 Versão Java RMI + TCP ___________________________________________________ 4 Arquitectura da aplicação ______________________________________________ 5 Autenticação ______________________________________________________________ 5 Eu acabo os outros acabam _________________________________________________ 6 Envio e recepção de mensagens _____________________________________________ 7 Comunicação ________________________________________________________ 8 Objectos transitáveis da aplicação ___________________________________________ 8 Tratamento de falhas _______________________________________________________ 8 Manual do utilizador _________________________________________________ 10 Manual de instalação e configuração ___________________________________ 12 Anexo I – compila.bat ________________________________________________ 13 Anexo II – registo.bat ________________________________________________ 13 Anexo III – teste.bat __________________________________________________ 13 841068998 -2- Sistemas Distribuídos SuDoku Introdução Desenvolvimento de uma aplicação em Java, que permite que vários utilizadores em modo distribuído possam competir num campeonato de SuDoku1 e ao mesmo tempo comunicar entre si. Regras do jogo SuDoku O SuDoku é um jogo que consiste no preenchimento de grelhas (9x9) de números. A única regra a respeitar no preenchimento de grelhas SuDoku é a não existência de repetições de números em cada linha, coluna e bloco. Assim, para resolver a grelha, cada linha, coluna e bloco, tem de conter todos os números de 1 a 9, estando resolvida quando todos os seus quadrados estiverem preenchidos. Cada grelha tem solução única. Chat A aplicação tem um serviço de mensagens instantâneas. Com este serviço, pode conversar online através de mensagens de texto em tempo real com os utilizadores autenticados. Ranking O ranking é actualizado automaticamente. O utilizador deverá tentar preencher a grelha o mais rápido possível: assim que terminar envia para o servidor. O primeiro cliente a enviar a grelha correctamente preenchida ganha os respectivos pontos associados à grelha e aumenta a sua pontuação no ranking. Planeamento do projecto Este trabalho está dividido em várias metas. Versão UDP + TCP A comunicação entre os clientes e os servidores é feita através de sockets TCP e UDP. Os servidores obedecem a um mecanismo de replicação. A aplicação é multithreaded. Existe serialização de objectos. É feito o tratamento de excepções e o 1 O conceito SuDoku apareceu com o matemático suíço Leonhard Euler que em 1783 inventou os quadrados latinos. O termo SuDoku, originalmente Suuji Wa Dokushin Ni Kagiru, foi aplicado em 1986, no Japão, e significa “os números têm que estar sós” ou “os números aparecem uma única vez”. 841068998 -3- Sistemas Distribuídos SuDoku tratamento das falhas transitórias nos sockets de comunicação. Versão Java RMI + TCP A comunicação entre os clientes e o servidor primário é feita através de sockets TCP ou Java RMI. Entre os servidores, a comunicação é feita através de Java RMI. Podemos ter clientes a usar esta versão RMI que estão a jogar contra e a comunicar com outros clientes que usam a versão baseada em Sockets, ou seja há interoperabilidade entre versões. Os servidores obedecem a um mecanismo de replicação como na versão em Sockets e são conhecidos por diferentes nomes (exemplo: ServerA, ServerB, ...). A detecção de falhas entre servidores é também implementada usando Java RMI. Versão HTTP + Servlets A comunicação entre cliente e servidor é feita através de HTTP/POST e tem um motor de Servlets (Tomcat) para receber as invocações HTTP enviadas pelos clientes. A Servlet interactua com o servidor central (versão anterior) através de invocações RMI. Passamos a ter três possíveis canais de comunicação com o servidor: Sockets TCP, Java RMI e HTTP/POST. Podemos ter clientes das 3 versões a interactuar uns com os outros de uma forma flexível e sustentada. 841068998 -4- Sistemas Distribuídos SuDoku Arquitectura da aplicação SERVIDOR JAVA RMI & SOCKETS Sockets TCP SERVIDOR TOMCAT Java RMI Java RMI HTTP/POST HTTP/POST Os clientes comunicam com o servidor Java RMI &Sockets, para o envio de objectos, através de sockets TCP, usando ObjectStreams, ou através Java RMI, ou através de um motor de Servlets (Tomcat) para receber as invocações HTTP/POST enviadas pelos clientes (HTTP). Temos então, três possíveis canais de comunicação com os servidor: Sockets TCP, Java RMI e HTTP/POST. Autenticação Antes do novo jogador poder jogar num campeonato apresentar decorrente, no dever-se-á campeonato. Essa apresentação consiste no login e na password que, devidamente reconhecidos, o integram imediatamente no mesmo campeonato, fornecendo apenas uma mensagem de acolhimento imediatamente seguida da grelha em jogo e ranking corrente. No caso do não reconhecimento dos mesmos dados, ser-lhe-á pedido iterativa e indefinidamente dados reconhecíveis. 841068998 -5- Sistemas Distribuídos SuDoku Cliente Não Autenticado Servidor Cliente Autenticado Autenticação Não aceite Grelha Ranking Eu acabo os outros acabam Para potenciar maior competitivismo, o campeonato não espera por jogadores morosos. Assim que uma grelha é terminada por um jogador, submete-se imediatamente ao servidor (sem moção do jogador) com o fim de competir por uma chegada triunfal. No sucesso desta operação, os outros serão notificados desta vitória antes de receberem nova grelha e actualização do ranking. Cliente Autenticado Servidor Clientes Autenticados Grelha preenchida Notificação de fim 841068998 Ranking Ranking Grelha Grelha -6- Sistemas Distribuídos SuDoku Envio e recepção de mensagens Durante todo o jogo a aplicação fornece um serviço de conversação em quadro. Este quadro está disponível para que cada jogador possa escrever as suas mensagens, sabendo que todos os adversários as possam devidamente identificadas quanto ao autor. Cliente Autenticado Servidor Clientes Autenticados Envio de mensagem Difusão de mensagens 841068998 -7- Sistemas Distribuídos SuDoku Comunicação Toda a comunicação entre clientes e servidores é estabelecida através de canais TCP, sob o formato de objectos serializáveis, através de Java RMI ou através de HTTP/POST. A comunicação entre servidores é estabelecida em Java RMI. O servidor Tomcat tem um motor de servlets que recebe pedidos do cliente e interactua com o servidor primário através de Java RMI. Objectos transitáveis da aplicação Os objectos que transitam entre o cliente e o serviço são: Autenticação o Do cliente para o servidor: para que este o identifique; o Do servidor para o cliente: para que se complete o currículo SuDokuzesco; Grelhas o Do servidor para o cliente: incompletas, para que este as complete; o Do cliente para o servidor: completas e identificadas para que o serviço pontue e catalogue; Ranking o Do servidor para o cliente: para que este proceda à sua amostragem; Mensagens o Do cliente para o servidor: para que este proceda à suas difusão; o Do servidor para o cliente Reencaminhamento de alguma mensagem de cliente (chat); Acolhimento (início); Autenticação inválida; Fim de jogo + vitória de <fulano> Tratamento de falhas A aplicação foi desenhada para estabelecer o campeonato num sistema de vários servidores. Um primeiro estabelece-se como primário enquanto que os outros se mantêm num hibernismo, só interrompido pela detecção de uma falha do servidor, momento em que é discutido e estabelecido a assumissão de uma nova promoção a servidor primário. O cliente que detectar a quebra de um serviço, irá continuar a tentar a restabelecer a sua ligação a esse serviço, seja ao servidor anterior seja ao novo, sem incomodar o jogador, a menos que, num período máximo predefinido, este não 841068998 -8- Sistemas Distribuídos SuDoku seja re-estabelecido, altura em que abandonará os dados a enviar, pelo motivo da não continuação do campeonato. Esta aplicação foi agora re-desenhada para estabelecer conectividade com um servidor Tomcat. Caso ocorra alguma falha temporária no socket de comunicação entre a aplicação cliente e as Servlets que executam no Tomcat, o cliente irá continuar a tentar restabelecer a sua ligação, abrindo de novo o socket para com um servidor disponível, dentro de um período máximo predefinido. Período esse que, se ultrapassado, o faz assumir indisponibilidade de comunicação com um servidor, sem incomodar o jogador que poderá continuar a jogar o jogo Sudoku, pois mais à frente a conectividade com o servidor Tomcat poderá ser re-estabelecida. O jogador apenas sentirá o problema quando tentar usar o chat sem sucesso, ou se, acabando o jogo, não conseguir restabelecer a comunicação. 841068998 -9- Sistemas Distribuídos SuDoku Manual do utilizador Quando devidamente autenticado, a consola assumirá uma aparência como a mostrada na figura seguinte: Do lado esquerdo encontra-se o ranking activo, com a listagem da pontuação dos jogadores activos. Nesta imagem, o ranking encontra-se vazio por ainda não haver jogadores pontuados no servidor. Do lado direito, encontra-se uma secção de chat. Em cima, um histórico de conversações desde que foi ligado, enquanto que em baixo se encontra uma caixa para entrada de uma mensagem, que será enviada para o servidor e difundida por todos os jogadores, incluindo ele próprio, altura em que verá o histórico ser actualizado com a mensagem que ele terá escrito. No centro encontra-se a secção do jogo: no topo, um amostrador de valores correntes ao jogo, com o tempo despendido nesta grelha e a pontuação deste jogador (inactivo nesta versão); em baixo, uma caixa de mensagens, onde a consola mostrará mensagens reguladoras do jogo; finalmente, no centro, poder-se-á ver a grelha onde o jogador poderá realizar o seu jogo. Na grelha, a preto, vê-se os números fornecidos pelo servidor; a azul, as experiências do jogador. Esta grelha, não permite a inserção de algarismos incorrectos de acordo 841068998 - 10 - Sistemas Distribuídos SuDoku com as regras deste jogo, pelo que o jogador, para efectuar uma experiência, apenas precisa de ‘clicar’ numa casa vazia que ficará disponível (casa com fundo a branco) para a inserção de uma algarismo através do teclado. Para anular uma experiência, deverá fazer um duplo ‘clique’ na casa com a experiência com a pretensão de ser anulada. Quando estiverem experiências em todas as casas, uma vez que a consola não aceita experiências inválidas, estará uma grelha correcta pronta a competir em tempo com adversários, pelo que a consola incumbe-se de enviar automaticamente a grelha ao servidor sem esperar pelo jogador. Sendo aceite (o servidor poderá receber outra grelha que se lhe anteceda), todos os jogadores serão notificados, actualizados e inseridos numa nova ronda do campeonato. 841068998 - 11 - Sistemas Distribuídos SuDoku Manual de instalação e configuração Descompactar todo o conteúdo de sudoku.zip para um directório destino a gosto. Dentro do directório SuDoku, 1) em Windows, executar o ficheiro 'start.cmd'; 2) se não estiver o directório do ‘java/bin’ no ‘path’, colocá-lo; 3.a) executar o comando: compila (Anexo I); 3.b) dentro do directório classes executar o comando: registo (Anexo II); 4) executar o comando: teste (jogo do SuDoku) (Anexo III). 841068998 - 12 - Sistemas Distribuídos SuDoku Anexo I – compila.bat javac -d classes src\elementos\*.java src\jogo\*.java src\net\*.java src\net\tcp\*.java src\net\rmi\*.java src\sudoku\*.java src\swing\*.java src\utils\*.java rmic -classpath classes -d classes net.rmi.RMIServer rmic -classpath classes -d classes net.rmi.RMIClient Anexo II – registo.bat start rmiregistry Anexo III – teste.bat java sudoku.Teste 841068998 - 13 -