Relatório do trabalho para a disciplina Redes de Computadores 2
Aluno: Vinicius Gabriel Machado (GRR20182552)
Professor: Elias P. Duarte Jr.
Departamento de Informática - Bacharelado em Ciência da Computação (BCC) - UFPR
Abril 2022
Por favor, não visualizar em um ambiente mobile.
Descrição do trabalho:
Fluxo de Execução:
- Inicialização:
Primeiramente os 3 servidores são inicializados. Depois disso a cache é inicializada e por fim, o cliente.
python3 server.py 1
python3 server.py 2
python3 server.py 3
python3 cache.py
python3 client.py
- Solicitação por um dado:
Na interface do cliente é solicitado qual dado de temperatura o usuário deseja verificar.
A entrada esperada é um número entre 1 e 3, com a seguinte equivalência:
1 - Dado de temperatura do servidor da Antártida
2 - Dado de temperatura do servidor do Deserto de Atacama
3 - Dado de temperatura do servidor do Monte Everest
- Processamento da solicitação:
Inicialmente o cliente envia o id do servidor, que deseja saber o dado de temperatura, para a cache.
A cache por sua vez consulta a sua tabela hash contendo o dado registrado da última consulta e o momento de realização da última consulta.
Há duas circunstâncias:
1 - Se a última consulta tiver sido feita há 30 segundos, o dado é coletado da tabela hash e enviado ao cliente, que exibe ao usuário.
2 - Se a última consulta tiver mais de 30 segundos, o dado é solicitado ao servidor correspondente por meio do envio de uma flag: get_data.
O servidor por sua vez gera um novo dado aleatório de acordo com o range de temperatura adequado e envia à cache uma string já formatada.
A cache então envia ao cliente, que exibe ao usuário.
Detalhes da implementação:
- Linguagem utilizada:
Python.
- Bibliotecas:
socket, sys, time e secrets.
- Host:
localhost
- Portas:
42111, 42222 e 42333.
- Ranges de temperatura:
Antartida: fim: -10 e início: -60
Deserto de Atacama: fim: 32 e início: -2
Monte Everest: fim: -19 e início: -3
Arquivos:
- Fluxo de execução de exemplo para os logs:
- Logs:
- Implementação:
Diário de implementação:
1 - Criada conexão client e cache de teste para a manipulação do socket, com operação de envio e recebimento de um unico dado
2 - Organização do código em funções e métodos
3 - Definição de uma cache com os campos: segundo de acesso, dado e porta do servidor que contêm o dado para quando for feita a consulta (ainda não foi feito os servidores)
4 - Implementação de uma interface para o cliente solicitar dado do servidor que for de interesse (utilizando apenas o client no momento)
5 - Realização da conexão com a cache, solicitando o dado de acordo com a entrada do usuário
6 - Teste de leitura, armazenando valores aleatórios na cache (sem conectar com os servidores ainda) com tempo de validade
7 - Implementação dos servidores com uma porta diferente para cada (com o mesmo arquivo python diferenciando na linha de comando os servidores)
8 - Conexão dos servidores com a cache
9 - Alteração do método de acesso aos dados, usando agora os servidores conectados
10 - Criação de um dicionário próprio para os dados dos servidores (porta e conexão), removendo da cache
11 - Adição de comentários no código
12 - Adaptação do código de geração de números aleatórios, usando um range definido para cada servidor
13 - Criação de mensagens de log
14 - Adição de timestamps para os logs