Relatório Trabalho Prático de Redes de Computadores 2

Autores:

Michel Brasil Cordeiro (GRR20172663)
mbc17@inf.ufpr.br

Vinícius Teixeira Vieira dos Santos (GRR20186716)
vtvs18@inf.ufpr.br

1. Introdução

Este relatório tem como objetivo descrever a implementação do trabalho prático da disciplina Redes de Computadores II. A implementação em questão simula uma aplicação que coleta informações de três servidores de temperatura através de um servidor cache. A linguagem de programação escolhida pela dupla para desenvolver o trabalho foi o python.

2. Executando os Arquivos

Para que o trabalho funcione corretamente, primeiro deve-se executar os servidores de temperatura, que ficarão esperando a conexão com o servidor cache. Então executa o servidor cache e por fim o cliente.

3. Formato das mensagens

Os servidores e os clientes trocam mensagens que possuem três números inteiros: um número inteiro contendo o identificador do servidor, um número inteiro contendo o tipo da mensagem e um número inteiro para armazenar a temperatura. O campo tipo pode possuir três valores diferentes: '0' é o tipo requisição, que é utilizado pelo cliente para requisitar a temperatura a um dos servidores; o número '1' siginifica que a mensagem é do tipo resposta, que é utilizado pelos servidores para responder a uma requisição; e o '2' é p tipo encerramento, que dá a ordem para os servidores finalizarem as conexões e encerrarem seus processos.

4. Arquivos

O trabalho possui seis arquivos: 4 arquivos com código, um arquivo de log e este relatório. Os arquivos com código estão descritos a seguir.

4.1 Arquivo “lib.py”

O arquivo “lib.py” é um módulo contendo algumas constantes e uma classe para armazenar e manipular as mensagens entre os processos. As constantes possuem os nomes, os endereços IPs e os valores das portas de cada um dos servidores. A classe das mensagens possui um método que retorna um vetor de bytes contendo as informações daquela mensagem. Isso é importante pois as funções de envio dos sockets só aceitam vetor de bytes como parâmetros. Também existe uma função que instancia um objeto da classe mensagem a partir de um vetor de dados.
Visualizar arquivo

4.2 Arquivo “cliente.py”

A implementação do cliente está no arquivo “cliente.py”. A interação do usuário com o cliente acontece pelo do terminal. O usuário pode dar os seguintes comandos ao cliente: “0”,”1” e “2” - Pede a temperatura de um dos servidores de temperatura para o servidor cache. “h” - Imprime a mensagem de ajuda. “q” - Envia mensagem de encerramento para servidor cache e termina o processo.
Visualizar arquivo

4.3 Arquivo “cache.py”

O arquivo “cache.py” implementa o servidor com a tabela cache. A tabela cache é armazenada em um dicionário, pois em python o dicionário é implementado utilizando uma tabela hash. As chaves da tabela são os identificadores dos servidores e os dados são representados por listas com dois elementos, um elemento é a temperatura e o outro é o horário em que a temperatura foi armazenada. Ao receber uma requisição do cliente, o servidor cache verifica se o horário da gravação é maior que o horário atual menos o tempo de expiração. Se sim, a informação ainda está dentro do prazo de validade e o servidor cache esta informação para o cliente. Caso contrário, o servidor encaminha a mensagem de requisição para o servidor de temperatura que foi solicitado pelo cliente. Ao receber a resposta, o servidor cache atualiza a tabela cache e encaminha a resposta para o cliente.
Visualizar arquivo

4.4 Arquivo “servidor.py”

O arquivo “servidor.py” implementa os servidores que obtém a temperatura dos locais e links estabelecidos pelo arquivo lib.py. Para que sejam obtidas as temperaturas, é utiliza a biblioteca de requests do Python, realizando uma requisição HTTP utilizando os links definidos e tratando a resposta obtida para inteiros por meio de regex. Os links utilizam o wttr.in e possuem um padrão de https://wttr.in/?format="%t", onde é o nome do local em inglês que se deseja verificar. Assim como a tabela cache se comunica com o cliente por meio de sockets, os servidores também se comunicam com a cache por meio de sockets, cada um utilizando uma porta diferente (também definidas na lib.py) e por meio do loopback. Ao receber uma requisição da tabela cache, o servidor verifica a temperatura de sua localização e envia uma resposta à tabela. Caso não seja possível obter a temperatura, é enviada uma resposta do tipo erro.
Observação: O final do link com ?format="%t" é necessário para que seja obtida uma resposta dos servidores da https://wttr.in/ que seja mais fácil de ser tratada.
Visualizar arquivo

4.5 Logs

Logs com exemplos de execução do sistema podem ser encontrados aqui.

5. Diagrama de Atividade

O diagrama abaixo descreve um fluxograma que demonstra as atividades executadas pelo sistema demonstrando como são feitas requisições e enviadas as mensagens.

Diagrama de Atividade