Lab6 Marcus Edson

aluno: Nome do Aluno
ano/sem: 2008/2o.
data do laboratório (num. da semana) : 06/08/2008 (2)

Introdução

Esse laboratório é a continuação do laboratório 5. Nele foi desenvolvida a parte do cliente que irá se comunicar com o servidor do lab5. O projeto foi desenvolvido em Ruby e foi utilizado o Shoes para a interface gráfica.

Desenvolvimento

O código do cliente é mostrado abaixo:

require 'socket'
require 'yaml'
 
Shoes.app :title => "Cliente", :width => 300, :height => 400 do
  flow :margin=>5 do
    para "Bolao Virtual", :font=>50
    button "Criar Usuario", :width=>"90%" , :margin=>20 do
      window :title => "Criar novo usuário", :width => 300, :height => 400  do
 
        stack :margin=>10 do
          stack :margin=>10, :width=>100 do
            para "Nome"
            @username=edit_line :width=>"100%"
          end
 
          stack :margin=>10, :width=>100 do
            para "Senha"
            @senha=edit_line :width=>"100%"
            @senha.style :secret=>true
          end
          flow :margin=>10 do
 
            button "Criar Novo Usuario", :center=>true do
              $cliente = TCPSocket.new('127.0.0.1', 4344)
              $cliente.puts "INICIO"
              $cliente.puts( 
                  {
                  "request" =>
                    {
                    "operation" => "criar_usuario", 
                    "username" => @username.text,
                    "password" => @senha.text
                    }
                  }.to_yaml
                  )
                  $cliente.puts "FIM"  
                    string = $cliente.gets
                    alert"Usuario Criado"
                    close
            end
          end
        end
      end
    end
 
    button "Logar", :width=>"90%", :margin=>20 do
      window :title => "Fazer login", :width => 300, :height => 400  do
 
        stack :margin=>10 do
          stack :margin=>10, :width=>100 do
            para "Nome"
            @username=edit_line :width=>"100%"
          end
 
          stack :margin=>10, :width=>100 do
            para "Senha"
            @senha=edit_line :width=>"100%"
            @senha.style :secret=>true
          end
          flow :margin=>10 do
 
            button "Logar Usuario", :center=>true do
              $cliente = TCPSocket.new('127.0.0.1', 4344)
              $cliente.puts "INICIO"
              $cliente.puts( 
                  {
                  "request" =>
                    {
                    "operation" => "autenticar_usuario", 
                    "username" => @username.text,
                    "password" => @senha.text
                    }
                  }.to_yaml
                  )
                  $cliente.puts "FIM"  
                    string = $cliente.gets
                    alert"Usuario Logado"
                    close
 
#################################################################
##### AQUI EH ABERTA A JANELA COM AS POSSIVEIS OPERACOES  #######
#################################################################
 
  w=window :title=>"Bolao Virtual", :width => 300, :height => 280 do
    flow do
      para "Selecione uma das opcoes abaixo: ", :font=>40
 
      button "Listar Partidas Atuais", :width=>"90%", :margin=>5 do
          $cliente.puts "INICIO"
          $cliente.puts( 
              {
              "request" =>
                {
                "operation" => "listar_partidas_atuais" 
                }
              }.to_yaml
              )
              $cliente.puts "FIM"  
              loop do
                string = $cliente.gets
                break if string && string.include?("INICIO")
              end
              yaml = $cliente.gets("\nFIM") 
              yaml = yaml.chomp("FIM")
 
              window :title => "Partidas Atuais", :width => 300, :height => 280 do
                para "Partidas Atuais"+"\n", :font=>30
                para yaml
                stack do
                    button "Fechar" do
                      close
                    end
                  end  
              end
 
      end
 
      button "Listar Partidas Encerradas", :width=>"90%", :margin=>5 do
        $cliente.puts "INICIO"
          $cliente.puts( 
              {
              "request" =>
                {
                "operation" => "listar_partidas_encerradas"
                }
              }.to_yaml
              )
              $cliente.puts "FIM"  
              loop do
                string = $cliente.gets
                break if string && string.include?("INICIO")
              end
              yaml = $cliente.gets("\nFIM") 
              yaml = yaml.chomp("FIM")
 
              window :title => "Partidas Encerradas", :width => 300, :height => 280 do
                para "Partidas Encerradas"+"\n", :font=>30
                para yaml
                  stack do
                    button "Fechar" do
                      close
                    end
 
                end
              end        
      end
 
      button "Informacoes de uma Partida", :width=>"90%", :margin=>5 do
        window :title => "Partida", :width => 300, :height => 280 do
          stack :margin=>10, :width=>100 do
            para "Partida: "
            @partida=edit_line :width=>200
          end
          stack do
            button "OK", :width=>"70%", :margin=>5 do
 
              $cliente.puts "INICIO"
              $cliente.puts( 
                  {
                  "request" =>
                    {
                    "operation" => "info_partida",
                    "match" => @partida.text
                    }
                  }.to_yaml
                  )
                  $cliente.puts "FIM"  
                  loop do
                    string = $cliente.gets
                    break if string && string.include?("INICIO")
                  end
                  yaml = $cliente.gets("\nFIM") 
                  yaml = yaml.chomp("FIM")
 
                  window :title => "Informacoes da partida", :width => 300, :height => 280 do
                    para "Partida"+"\n", :font=>30
                    para yaml
                      stack do
                        button "Fechar" do
                          close
                        end
                      end  
                    end
            end
            button "Cancelar", :width=>"70%", :margin=>5 do
              close
            end
          end
        end
      end
 
      button "Apostas de uma Partida", :width=>"90%", :margin=>5 do
        window :title => "Apostas", :width => 300, :height => 280 do
          stack :margin=>10, :width=>100 do
            para "Nome da Partida: "
            @partida=edit_line :width=>200
          end
          stack do
            button "OK", :width=>"70%", :margin=>5 do
 
              $cliente.puts "INICIO"
              $cliente.puts( 
                  {
                  "request" =>
                    {
                    "operation" => "info_aposta",
                    "match" => @partida.text
                    }
                  }.to_yaml
                  )
                  $cliente.puts "FIM"  
                  loop do
                    string = $cliente.gets
                    break if string && string.include?("INICIO")
                  end
                  yaml = $cliente.gets("\nFIM") 
                  yaml = yaml.chomp("FIM")
 
                  window :title => "Apostas da partida", :width => 300, :height => 280 do
                    para "Apostas"+"\n", :font=>30
                    para yaml
                      stack do
                        button "Fechar" do
                          close
                        end
                      end  
                    end
            end
            button "Cancelar", :width=>"70%", :margin=>5 do
              close
            end
          end
        end  
      end
 
      button "Fazer Aposta", :width=>"90%", :margin=>5 do
        window :title => "Nova Aposta", :width => 300, :height => 300 do
 
        stack :margin=>10 do
          stack :margin=>10, :width=>100 do
            para "Partida"
            @partida=edit_line :width=>200
          end
 
          stack :margin=>10, :width=>100 do
            para "Placar(_X_)"
            @placar=edit_line :width=>200
          end
          flow :margin=>10 do
 
            button "OK", :width=>"70%" do
              $cliente.puts "INICIO"
              $cliente.puts( 
                  {
                  "request" =>
                    {
                    "operation" => "fazer_aposta",
                    "match" => @partida.text,
                    "score" => @placar.text
                    }
                  }.to_yaml
                  )
                  $cliente.puts "FIM"  
                  alert "Aposta Realizada"
                  close
            end
            button "Cancelar", :width=>"70%" do
              close
            end
 
            end
        end
        end
      end
 
      button "Sair", :width=>"90%", :margin=>5 do
        $cliente.puts "INICIO"
        $cliente.puts( 
        {
        "request" =>
          {
          "operation" => "encerrar_conexao"      
          }
        }.to_yaml
        )
        $cliente.puts "FIM"
        w.close
 
      end
 
    end
  end
 
#################################################################
###### AQUI TERMINA A JANELA COM AS POSSIVEIS OPERACOES #########
#################################################################            
            end
          end
        end
      end
    end
  end
end

Testes

Criação de um novo usuário

Abaixo são mostradas as telas de criação de um novo usuário. Ao clicarmos na opção de criar um usuário na tela principal, uma nova janela é aberta, onde podemos digitar o nome de usuário e a senha desejados. Após a criação bem sucedida a tela de criação é fechada e somente a janela principal fica aberta.
lab6_1.jpg
lab6_2.jpg

Login de um usuário cadastrado

Abaixo é mostrada a tela de login de usuário. Ele é bem semelhante à tela de cadastro de novo usuário. Ao clicarmos para fazer o login a tela é fechada e é aberta uma nova tela com as opções disponíveis para o usuário.
lab6_3.jpg
lab6_4.jpg

Listar partidas em andamento

Ao clicarmos para ver as partidas em andamento uma nova janela é aberta e nela são impressas as partidas como mostrado abaixo. Para sair dessa tela basta clicarmos no botão de fechar.
lab6_5.jpg

Listar partidas encerradas

Da mesma forma que para listar as partidas em andamento, temos a tela que lista as partidas encerradas. No caso mostrado abaixo não havia nenhuma partida encerrada no sistema.
lab6_6.jpg

Imagens das outras telas

Abaixo são mostradas as outras telas criadas:
lab6_7.jpg
Apesar de o restante do projeto estar funcionado normalmente, eu não consegui que essas duas telas funcionassem. Depois de passar bastante tempo tentando consertar o que estava errado eu não consegui. Acredito que o erro esteja no servidor e que ele não está retornando as informações de uma partida e das apostas de uma partida corretamente. Tentei resolver o erro no servidor, mas após exaustivas tentativas de consertar acabei por desistir de fazê-lo, visto que eu já estava em cima do prazo.
O projeto do lab6 está no link ao lado: Ces-22_Lab6

Conclusão

Foi bem interessante completar o laboratório 5 com a aplicação cliente. Apesar de não saber usar o Shoes, foi relativemente simples aprender e utilizar seus comandos básicos. Considerei esse laboratório mais simples que o anterior, apesar da necessidade de entender como o laboratório 5 funcionava para poder fazer este.
Observação: Não pude fazer a apresentação do meu laboratório final porque viajei na sexta-feira(5/12) à noite para Fortaleza. Passei na sala do professor Parente à tarde mas não havia ninguém lá. Quando vi o email dizendo que você, Bernardo, estava no h8 naquele dia vendo a apresentação do pessoal, eu já estava de saída para a rodoviária, por isso, infelizmente, não pude apresentar o trabalho naquele dia. Nesse dia eu estava mais ou menos na metade do laboratório5, já iniciando o servidor.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License