Criação de um Quiz em Sistemas Distribuídos com Python
Publicado em 28 de junho de 2023 por Lucas dos Santos Soares
UNIVERSIDADE FEDERAL DO PARÁ
CAMPUS UNIVERSITÁRIO DE CASTANHAL
FACULDADE DE COMPUTAÇÃO
SISTEMAS DE INFORMAÇÃO
CRIAÇÃO DE UM QUIZ EM SISTEMAS DISTRIBUÍDO COM PYTHON
George Lucas Assad[1]
Lucas dos Santos Soares[2]
INTRODUÇÃO
Os sistemas distribuídos são amplamente utilizados em vários campos, como computação em nuvem, Internet das Coisas (IoT), jogos online e redes sociais. Isso permite que diferentes partes do sistema sejam executadas em redes, hardwares, computadores com sistemas operacionais e até mesmo usando linguagens de programação totalmente diferentes uns dos outros.
Os Quizzes ainda são amplamente utilizados em vários campos, como educação, entretenimento e marketing. Estes questionários são uma maneira divertida de testar seu conhecimento sobre um tópico específico e podem ser usados para fins educacionais, como por exemplo, para avaliar o conhecimento de alunos.
Este artigo tem como objetivo o desenvolvimento de um questionário em sistemas distribuídos usando a linguagem de programação Python. O tema foi escolhido por ser uma área em constante crescimento e por apresentar desafios interessantes para os desenvolvedores. Python é uma linguagem de alto nível amplamente utilizada para desenvolvimento de aplicações distribuídas devido a sua facilidade de uso e flexibilidade. Ao decorrer do artigo, discutiremos os conceitos básicos de sistemas distribuídos e Python, bem como as etapas envolvidas no desenvolvimento de um quiz em sistemas distribuídos com Python.
Palavras-chave: Quiz. Sistemas distribuídos. Python.
REFERÊNCIAL TEÓRICO
QUIZ
Quiz é um jogo com várias perguntas, podendo ser jogado individualmente ou em grupo com o objetivo de acertar o máximo de respostas. É uma forma popular de avaliar o conhecimento, seja em um ambiente educacional ou em uma plataforma de entretenimento. Os questionários podem ser projetados para serem executados em várias plataformas, incluindo aplicativos móveis, sites e até mesmo ambientes de linha de comando.
SISTEMAS DISTRIBUÍDOS
Um sistema distribuído é definido como um conjunto de componentes de hardware ou software em computadores conectados em rede que se comunicam e coordenam suas ações através do envio de mensagens entre si. (COULOURIS, G. et al, 2001). Tais sistemas oferecem benefícios como desempenho aprimorado, escalabilidade e confiabilidade. Esses sistemas podem ser usados em uma variedade de aplicações, como rede de computadores, computação em nuvem, processamento de big data e em jogos multiplayer online.
PYTHON
Josué Labaki (2003, p. 05) define que “Python é uma linguagem de programação de altíssimo nível (VHLL – Very High Level Language), criada pelo holandês Guido Van Rossum sob o ideal de ‘Programação de Computadores para todos’ “. Python é uma linguagem fácil de aprender e poderosa. Ela apresenta estruturas de dados eficientes de alto nível e uma abordagem simples, mas eficaz, para programação orientada a objetos. A sintaxe simples e a digitação dinâmica do Python, combinadas com sua natureza interpretada, o tornam uma linguagem ideal para o desenvolvimento rápido de programas e aplicativos em muitos domínios e na maioria das plataformas.
BIBLIOTECAS PYTHON
Bibliotecas em Python são conjuntos de módulos e funções úteis que reduzem o uso de código no programa (M., 2022). Esses módulos são bem documentados e oferecem uma maneira eficiente de realizar tarefas comuns sem a necessidade de escrever código do zero. Desenvolvedores profissionais aproveitam esses módulos para economizar tempo e aumentar a eficiência no processo de programação.
Há uma ampla variedade de bibliotecas Python disponíveis para atender a diversas necessidades. Algumas das bibliotecas mais populares incluem NumPy e pandas para processamento de dados, scikit-learn e TensorFlow para aprendizado de máquina, Matplotlib e Seaborn para visualização de dados, e Django e Flask para desenvolvimento web, entre muitas outras. Para o desenvolvimento do Quiz em Sistemas Distribuído será utilizado as bibliotecas socket, pickle e tkinter.
SOCKET
A biblioteca socket em Python fornece acesso à interface de soquetes BSD (Berkeley Socket Distribution), que é uma maneira de se comunicar com outros programas usando o protocolo TCP/IP (“HOWTO sobre a Programação de Soquetes — documentação Python 3.8.16”, [s.d.]). Essa biblioteca permite a criação de conexões de rede, que envia e recebe dados através dessas conexões.
PICKLE
A biblioteca pickle em Python implementa protocolos binários para serializar e deserializar uma estrutura de objeto Python. “Pickling” é o processo pelo qual uma hierarquia de objetos Python é convertida em um fluxo de bytes, e “unpickling” é a operação inversa, na qual um fluxo de bytes (de um arquivo binário ou objeto semelhante a bytes) é convertido de volta em uma hierarquia de objetos (“pickle — Python object serialization”, [s.d.]). Isso permite o salvamento e carregamento de objetos complexos em Python.
TKINTER
A biblioteca Tkinter é a interface padrão do Python para o kit de ferramentas GUI Tcl/Tk. Ela permite que você crie interfaces gráficas de usuário (GUIs) para seus programas em Python (“tkinter — Interface Python para Tcl/Tk”, [s.d.]). Com Tkinter, é possivel criar janelas, diálogos, botões, menus e outros elementos de interface mais comuns.
DESENVOLVIMENTO
METODOLOGIA
Para o desenvolvimento do quiz, foi utilizado o Python 3. Foram criados dois arquivos principais, o server.py e o client.py. Usando a biblioteca socket para fazer a conexão entre o servidor e o cliente. A biblioteca pickle foi utilizada para transformar as tuplas de perguntas em bytes e serem transportadas e a biblioteca tkinter foi usada para a criação da interface no lado do cliente.
INTERFACE GRÁFICA
Utilizando o Tkinter foi criado uma interface exibindo 4 perguntas e um botão para respondê-las, mostrado na Imagem 01 abaixo.
Imagem 01 – Interface do Cliente
FONTE: Autores
O jogo continua até que todas as perguntas tenham sido respondidas ou até que o jogador erre uma resposta. Se o jogador acertar todas as perguntas, uma mensagem de parabéns é exibida, Imagem 02. Caso contrário, uma mensagem de fim de jogo é exibida, Imagem 03.
Imagem 02 – Resposta Correta
FONTE: Autores
Imagem 03 – Resposta Errada
FONTE: Autores
DESENVOLVIMENTO DO QUIZ
O código consiste em um sistema de quiz em rede, composto por dois arquivos: server.py e client.py. O sistema de quiz utiliza o protocolo TCP/IP para comunicação entre o servidor e o cliente.
SERVIDOR
No código do servidor é definido duas funções principais, handle_client() e start_server().
Na função start_server(), o servidor aguarda uma conexão de cliente em um determinado endereço IP e porta, mostrado na Imagem 04, foi criado as variáveis HOST e PORT, respectivamente com os valores, '127.0.0.1' e 1234.
Imagem 04 – start_server()
FONTE: Autores
Na linha 2, a variável server_socket é instanciada com a criação do servidor na configurações IPV6 e o protocolo TCP/IP, respectivamente socket.AF_NET e socket.SOCK_STREAM. A função server_socket.bind((HOST, PORT)) define o endereço e porta de conexão do servidor, já definido anteriormente e o server_socket.listen() aguarda a conexão com um cliente. Na linha 9 mostra é onde a conexão com o cliente é aceita.
Assim que um cliente se conecta, o servidor estabelece uma conexão e inicia o jogo. A Imagem 05 mostra a conexão bem-sucedida do cliente no servidor.
Imagem 05 – Cliente Conectado
FONTE: Autores
Já na função handle_client() o servidor possui uma lista de perguntas, opções de resposta e respostas corretas. Cada pergunta é representada como uma tupla contendo a pergunta em si, uma lista de opções e o índice da resposta correta dentro da lista de opções. A seguir na Imagem 06.
Imagem 06 – Perguntas e Resposta
FONTE: Autores
As perguntas são iteradas usando um loop for. Durante cada iteração, o servidor envia a pergunta, as opções e um sinalizador para indicar se é o fim do jogo para o cliente. O servidor usa o módulo pickle para serializar os dados e enviá-los como bytes pelo socket. Abaixo em Imagem 07.
Imagem 07 – Envio de perguntas
FONTE: Autores
Por fim na linha 20 mostrado na Imagem 07, o cliente é fechado assim que o quiz é finalizado.
CLIENTE
O cliente, por sua vez, inicia uma conexão com o servidor. Ele utiliza a biblioteca Tkinter para criar uma interface gráfica simples com uma janela, uma pergunta, opções de resposta e um botão para enviar a resposta, mostrado na Imagem 08.
Imagem 08 – Conectando e criando uma interface
FONTE: Autores
Nas linhas 1 a 5, da Imagem 08 é a conexão do cliente ao servidor e das linhas 7 a 12 a criação da interface com o Tkinter.
Quando o cliente envia uma resposta, através da função enviar_resposta() visto na Imagem 09. A resposta é convertida em string e enviada para o servidor através do socket. Em seguida, o cliente recebe o resultado do servidor, que pode ser "acertou" ou "errou". Com base nesse resultado, uma caixa de diálogo é exibida informando se a resposta estava correta ou incorreta.
A pergunta e as opções de resposta são atualizadas usando a função atualizar_pergunta() mostrado na Imagem 10. Se a resposta estiver correta, a função é chamada novamente para atualizar a próxima pergunta. Se a resposta estiver incorreta, o cliente encerra a conexão com o servidor e fecha a janela.
Imagem 09 – Função enviar_resposta()
FONTE: Autores
Imagem 10 – Função atualizar_pergunta()
FONTE: Autores
O jogo continua até que todas as perguntas tenham sido respondidas ou até que o jogador erre uma resposta. Se o jogador acertar todas as perguntas, uma mensagem de parabéns é exibida. Caso contrário, uma mensagem de fim de jogo é exibida.
UTILIZANDO O PROGRAMA
Para utilizar o sistema, é precisa executar o arquivo server.py em um terminal ou ambiente Python. Em seguida, execute o arquivo client.py em outro terminal ou ambiente Python. A interface gráfica será exibida e será possível interagir respondendo às perguntas do quiz.
Os arquivos estão disponíveis em um repositório público no GitHub, no endereço: https://github.com/DEV-LUK4Z/projeto_de_sistemas_distribuidos
CONCLUSÃO
O artigo apresentou uma metodologia para o desenvolvimento de uma implementação básica de um quiz em sistemas distribuído, demonstrando como é possível criar uma aplicação cliente-servidor para esse propósito.
A metodologia utilizada pode ser aplicada a outros projetos semelhantes, o que amplia ainda mais sua relevância, sendo possível personalizar as perguntas, as opções de resposta e o número necessário de acertos para vencer o jogo de acordo com as necessidades do utilizador.
REFERÊNCIAS
COULOURIS, George; DOLLIMORE, Jean; KINDBERG, Tim. Sistemas distribuidos. Addison Wesley, 2001.
HOWTO sobre a Programação de Soquetes — documentação Python 3.8.16. Disponível em: . Acesso em: 10 jun. 2023.
LABAKI, Josué; WOISKI, E. R. Introdução a python–Módulo A. Grupo Python, UNESP-Ilha Solteira, 2003.
M., L. Bibliotecas Python: Qual é a melhor para cada situação? Disponível em: . Acesso em: 10 jun. 2023.
O tutorial de Python. Disponível em: . Acesso em: 10 jun. 2023
pickle — Python object serialization. Disponível em: . Acesso em: 10 jun. 2023.
Quiz - Conceito, Definição e O que é Quiz. Disponível em: . Acesso em: 10 jun. 2023.
tkinter — Interface Python para Tcl/Tk. Disponível em: . Acesso em: 10 jun. 2023.
