aluno: Adriano Brasileiro Silva
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 22/12/2008 (5)
Introdução
Nesta prática pegamos um sistema de "bolão" pronto e implementamos uma comunicação entre servidos e um cliente, que será criado na próxima prática
Desenvolvimento
Melhoria nos decorators
Não há muito o que explicar, visto que foram seguidas as instruções indicadas na prática. Ao final das implementações, o teste não acusa nenhum erro
Criação dos builders
Mais uma vez foram implementados segundo o que nos foi instruído. Não houveram problemas
Criação do protocolo
Optei por utilizar a sintaxe de yaml, que é mais fácil de entender e trabalhar, já que a maioria de suas funções já estão prontas
Neste caso, foi necessário apenas criar um novo printer, o "yaml_match_printer", para escrever as informações sobre uma partida, pois o "yaml_match_list_printer", que lista informações sobre todas as partidas, já havia sido criada.
O servidor recebe um pedido no seguinte formato, um pouco diferente do indicado nas instruções:
INICIO
---
request:
operation: "nome da operação"
parametro1: "os parâmetros são passados junto com a operação,"
parametro2: "e não em uma array separada"
...
FIM
O servidor então entra em um switch com base na operação e vai para a função correspondente. Uma vez entrado na ramificação, o servidor pode enviar uma resposta imediatamente caso seja necessário (como no login). Após processar o pedido, o método "read" do RequestReader é encerrado e o método main o chama novamente, fazendo com que se espere por outro pedido (pode-se ver o momento em que o servidor espera por um pedido quando se imprime em $stdout a palavra "READY".
Servidor Multithread
O arquivo server.rb contém o código do servidor. Nesta parte houveram alguns problemas que eu tive que contornar de maneira um pouco inconveniente: o require 'initialize' feito no topo do código não criava o logger e nem o método "to_score", de modo que passei essas linhas do "initialize" direto para o "server". Inclusive, aparentemente o "initialize" não fazia require em todos os arquivos, pois ainda foi necessário fazer require em vários arquivos. De qualquer modo, ao ser inicializado, o servidor cria a match_list e a user_list através dos builders e espera por novas conexões. Então cada conexão entra na função main em uma thread separada.
Testes
Criei cinco partidas que estão armazenadas em matches.yml, sendo três em andamento e duas finalizadas. Conectando-se ao servidor com o telnet e fazendo uma operação simples:
O formato não é muito conveniente mas é possivel ver que há comunicação com o servidor
Conclusões
Esta prática foi bastante difícil, principalmente para se entender o que deveria ser feito, já que nunca tínhamos visto sobre esta comunicação entre servidor e cliente. Mas foi uma prática muito interessante e que proporcionou um grande aprendizado, uma vez concluído.
A contagem de linhas para o lab6 foi de 277 linhas (linhas adicionadas, contando linhas em branco)
O código fonte, assim como em todos os outros labs, encontra-se em anexo





