Introdução às Redes de Computadores/Jogo da Forca
Resumo do projeto
editarConstrução de um protocolo em nível de aplicação baseada na arquitetura cliente/servidor.
Definições do Projeto
editarA arquitetura cliente-servidor é o modelo mais utilizado para aplicações distribuídas em redes de computadores. No modelo cliente/servidor, a comunicação costuma se dar através de uma mensagem de solicitação do cliente enviada para o Servidor, pedindo para que alguma tarefa seja executada. Em seguida, o servidor executa a tarefa e envia a resposta (Tanenbaum, 1997).
A tecnologia socket é utilizada no desenvolvimento de aplicações do modelo cliente/servidor, para possibilitar a comunicação em rede. De acordo com Tanenbaum cada socket tem um número que consiste no IP do host mais um número de 16 bits local para este host, denominado porta. Para que a comunicação funcione é necessário que uma conexão seja estabelecida entre um socket da máquina transmissora e um socket da máquina receptora.
A arquitetura da aplicação desenvolvida utiliza o modelo cliente/servidor e a tecnologia socket. A aplicação servidora fornece as palavras e dicas à aplicação cliente. As palavras são aleatórias e suas respectivas dicas são selecionadas de um vetor que contém as palavras e suas dicas, que fica junto à aplicação servidora.
A comunicação para a realização do jogo foi feita utilizando o protocolo Telnet. Assim, Telnet é um protocolo cliente-servidor de comunicações usado para permitir a comunicação entre computadores ligados numa rede (exemplos: rede local / LAN, Internet), baseado em TCP. Telnet é um protocolo de login remoto. Aqui a porta utilizada de comunicação com o Telnet é 5555.
As mensagens específicas das palavras do projeto em si, são enviadas unicamente para fechar a conexão, uma vez que as outras mensagens envolvidas no projeto são comandadas pelo próprio protocolo Telnet.
Os problemas de segurança que podem ser encontrados é que o nosso projeto não é criptografado e portanto não tem nada que possa oferecer algum tipo de segurança.
As melhorias futuras que podem ser realizadas neste projeto são: comunicação entre um servidor com vários clientes simultaneamente, aumento do número de dicas para o jogo da forca, bem como construir um cliente com uma interface amigável. Uma possível melhoria seria a implementação que possibilitasse a leitura de palavras e dicas a partir de um arquivo txt.
Podemos citar, que os RFCs semelhantes ao projeto são os utilizados pelo HTTP, FTP bem como todos aqueles que utilizam a arquitetura cliente/servidor.
O código fonte reutilizado foi somente o protocolo cliente servidor que está desponível na página [1].
Diagrama de Mensagens
editarServidor.java
editarimport java.net.*; import java.io.*; /** * Esta classe implementa o servidor da aplicação * * @author Fabiana, Marco, Murillo, Vinícius, Xerxes * @version dez/2008 */ public class Servidor { /**Método Main. * @param args * @exception IOException */ public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(5555); } catch (IOException e) { System.err.println("Nao foi possivel abrir a porta: 5555."); System.exit(1); } Socket clientSocket = null; try { clientSocket = serverSocket.accept(); } catch (IOException e) { System.err.println("Socket nao aceito."); System.exit(1); } PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader( clientSocket.getInputStream())); String inputLine, outputLine; Forca_protocolo forcaprot = new Forca_protocolo(); outputLine = forcaprot.processInput(null); out.println(outputLine); while ((inputLine = in.readLine()) != null) { outputLine = forcaprot.processInput(inputLine); out.println(outputLine); if (outputLine.equals("TCHAU")) { break; } } /**Método responsável por fechar a instancia da classe PrintWriter ao final da execução */ out.close(); /**Método responsável por fechar a instancia da classe BufferedReader ao final da execução */ in.close(); /**Método responsável por fechar a instancia da classe Socket ao final da execução */ clientSocket.close(); /**Método responsável por fechar a instancia da classe ServerSocket ao final da execução */ serverSocket.close(); } }
Forca_protocolo.java
editar/** * Classe que implementa o protocolo do Jogo da Forca * * @author Fabiana, Marco, Murillo, Vinícius, Xerxes * @version dez/2008 */ public class Forca_protocolo { private static int INICIO = 0; private static int TENTATIVA = 1; private static int DECISAO = 3; private String palavravez = ""; private int npalavra, dica, tamanho = 0; private int state = INICIO; private String[] dicas = {"Sofre destilacao fracionada.", "Nao renovavel.", "Materia prima para gasolina.", "Utilizada para descanso.", "Deve ser regulada de acordo com o usuario.", "utiliza-se em mesas.", "Utilizada para unir supeficies.", "Nome dado a copias e provas.", "Pode ser liquida.", "Aparelhos utilizados pelas donas de casa.", "Liquidificador e um exemplo.", "Geladeira e um exemplo.", "Ciencia iniciada em E e final em A.", "Pode ser analogica ou digital.", "Forma de controlar energia eletrica.", "Suporte a um meio de transporte.", "Norte-Sul e um exemplo.", "Sistema baseado em trens.", "Substantivo abstrato.", "Começa com P e termina com O.", "Sinonimo de aflicao.", "Aplicacao de algum conhecimento com bom senso.", "Eletrica e um exemplo.", "CREA e o conselho da classe.", "Sistema operacional.", "Inspirado no minix.", "Slackware e um exemplo.", "Circuito integrado.", "Realiza calculos.", "Pentium e um exemplo."}; private String[] palavras = {"PETROLEO", "CADEIRA", "COLA", "ELETRODOMESTICOS", "ELETRONICA", "FERROVIA", "PREOCUPACAO", "ENGENHARIA", "LINUX", "PROCESSADOR"}; /**Retorna mensagens que são enviadas ao cliente, variavel theOutput * @param Recebe como parametro a entrada do usuário pelo teclado * @return theOutput */ public String processInput(String theInput) { String theOutput = null; if (state == INICIO) { npalavra = (int) (Math.random() * 10);//indice da palavra sorteada palavra dica = getNpalavra() * 3; palavravez = getPalavras()[getNpalavra()]; // palavra cujo indice foi sorteado tamanho = getPalavravez().length(); // tamanho da palavra theOutput = "Bem vindo ao JOGO DA FORCA. Qual a palavra? DICA: " + getDicas()[dica]; state = TENTATIVA; } else if (state == TENTATIVA) { if (theInput.equalsIgnoreCase(getPalavravez())) { theOutput = "PARABENS, VOCE ACERTOU! Deseja jogar novamente? (S/N)"; state = DECISAO; } else { dica++; if ((dica / 3) == getNpalavra()) { theOutput = "Ai vai outra dica: " + getDicas()[dica]; } else { theOutput = "VOCE FOI ENFORCADO. A palavra era: " + getPalavravez() + ". Quer jogar novamente? (S/N)"; state = DECISAO; } } } else if (state == DECISAO) { if (theInput.equalsIgnoreCase("S")) { theOutput = "PRESSIONE UMA TECLA PARA COMECAR"; state = INICIO; } else { theOutput = "TCHAU"; } } return theOutput; } /**Retorna a palavra que deve ser adivinhada * @return palavravez */ public String getPalavravez() { return palavravez; } /**Retorna o indice da palavra sorteada * @return npalavra */ public int getNpalavra() { return npalavra; } /**Retorna uma dica referente a palavara * @return dicas */ public String[] getDicas() { return dicas; } /**Retorna o vetor de palavras * @return palavras */ public String[] getPalavras() { return palavras; } }