Projeto de Programação - Gossip
Alunos:
Felipe Oliveira Silva
RA: 11201822479
Felipe de Souza Tiozo
RA: 11201822483
cd src
javac Peer.java && java Peer
1. Definição do Sistema Crie um sistema P2P não-estruturado que permita encontrar o peer que possui uma determinada informação a ser procurada, utilizando UDP como protocolo da camada de transporte e Gossip como protocolo de busca.
2. Recomendação Inicial Se nunca programou com TCP ou UDP, recomendo assistir o vídeo do link https://www.youtube.com/watch?v=nysfXweTI7o e implementar os exemplos mostrados. Só assistir o vídeo não lhe será de utilidade quando tiver que implementar funcionalidades mais complexas.
3. Visão geral do sistema O sistema será composto por muitos peers (com IP e porta conhecidas). Cada peer atua tanto como provedor de informações (neste caso dos nomes dos arquivos que possui) quanto como buscador destas. Considere que quatro peers peer1, peer2, peer3 e peer4 fazem parte do sistema P2P. Um peer, por exemplo o peer1, poderá procurar pelo nome de um arquivo e enviar essa requisição a outro (e.g., peer4), escolhido de forma aleatória. Caso o peer4 tenha o arquivo, responderá ao peer1 diretamente com seus dados (e.g., IP:porta de peer4). Caso o peer4 não tenha o arquivo, escolherá outro peer (e.g., peer3) e repetirá o processo.
4. Funcionalidades do Peer X
a) Recebe e responde simultaneamente (obrigatório com threads) requisições dos peers. Por ‘simultaneamente’ entenda-se que o peer deverá poder realizar outras funcionalidades enquanto está fazendo requisições ou esperando por elas.
b) Inicialização: captura do teclado o IP e porta do peer X, a pasta onde estão localizados seus arquivos, e o IP e porta de outros dois peers.
c) Monitoramento da pasta: cada 30 segundos o peer verificará se na pasta (capturada na inicialização) houveram modificações, ou seja se foram inseridos ou removidos arquivos. A lista de arquivos deverá estar armazenada em alguma estrutura na memória, por exemplo, uma lista ou um hash.
d) Envio de uma mensagem SEARCH: escolhe de forma aleatória um peer (obtidos na inicialização) a quem enviar a requisição, contendo o nome do arquivo procurado.
e) Recebe uma mensagem SEARCH: 1º importante, descarte requisições já processadas (i.e., já respondidas ou encaminhadas). 2º Caso o peer X tenha o arquivo, responderá diretamente a quem inicialmente realizou o SEARCH com uma mensagem RESPONSE (que contém o IP:porta do peer X). 3º Caso X não tenha o arquivo, encaminhará a requisição, repetindo o processo de envio do SEARCH (item d).
f) Recebe uma mensagem RESPONSE: descarte requisições já processadas.
g) Monitoramento do envio do SEARCH. No item d) quando o peer realiza um envio, pode que nunca receba a mensagem RESPONSE (pois ninguém possui o arquivo). Assim, o peer deve ter algum mecanismo para tratar esse caso (por exemplo, usando timeouts). Observações:
Toda comunicação entre peer peer será por UDP e deverá obrigatoriamente transferir uma classe Mensagem criada por você.
5. Mensagens (prints) apresentadas na console Na console do peer deverão ser apresentadas “exatamente” (nem mais nem menos) as seguintes informações
Menu interativo (por console) que permita realizar a escolha somente das funções INICIALIZA e SEARCH.
o No caso do INICIALIZA, deve capturar do teclado o IP:porta, a pasta onde se encontram os arquivos (e.g., c:\temp\peer1, c:\temp\peer2, etc.) e mais outros dois IP:porta. Faça print “arquivos da pasta: [só nomes dos arquivos]”.
o No caso do SEARCH, deve capturar do teclado só o nome do arquivo com sua extensão (e.g., aula.mp4). A busca será exatamente por esse nome. Note que não deve capturar a pasta.
Cada 30 segundos, print “Sou peer [IP]:[porta] com arquivos [só nomes dos arquivos]”. Substitua a informação entre os parênteses com as reais. Por exemplo: Sou peer 127.0.0.1:8776 com arquivos aula1.mp4 aula2.mp4 Quando receber a mensagem RESPONSE (caso não tenha sido processada antes), print “peer com arquivo procurado: [IP:porta] [arquivo_procurado]”. Se nunca receber a mensagem RESPONSE, print “ninguém no sistema possui o arquivo [arquivo_procurado]”. Quando receber uma mensagem SEARCH:
o Caso já tenha processado a requisição, print “requisição já processada para [arquivo_procurado]”.
o Caso não tenha processado a requisição: Se tiver o arquivo, print “tenho [arquivo_procurado] respondendo para [IP:porta]. Note que esse IP:porta é de quem inicialmente fez a busca. Se não tiver o arquivo, print “não tenho [arquivo_procurado], encaminhando para [IP:porta]. Note que esse IP:porta é aleatório.
6. Teste realizado pelo professor O professor compilará o código usando o javac da JDK 1.8. Após a compilação, o professor abrirá 4 consoles (no Windows, seria o CMD.EXE, também conhecido como prompt) correspondendo a 4 peers. A partir das consoles, o professor realizará os testes do funcionamento do sistema. Exemplo das consoles pode ser observado no link: https://www.youtube.com/watch?v=FOwKxw9VYqI Cabe destacar que: Seu código não deve estar limitado a 4 peers, suportando mais do que 4. Você não precisará de 4 computadores para realizar a atividade. Basta abrir as 4 consoles.