Atenção! As equipes definitivas já foram formadas: consultem no final da página.
Mini sistema de Correio Eletrônico
Implementaremos um pequeno sistema de e-mail, com um servidor e um cliente que executam em processos e máquinas diferentes mas se comunicam para executar a tarefa.
Este projeto será implementado em equipes de no mínimo 4 e no máximo 5 pessoas. Oportunamente definiremos formalmente as equipes, mas nada impede de as atividades já começarem a ser desenvolvidas.
Parte fácil (já podem ir adiantando)
Implemente uma classe Mensagem com os seguintes atributos: remetente, destinatário e corpo.
Para simplificar, cada um desses atributos pode ser um simples objeto String.
Tenham os Getters, os Setters e o Construtor implementados a contento.
O Servidor de mensagens
Recebe mensagens e garante sua persistência.
Use a estrutura que desejar para armazenamento (XML pode ser uma boa idéia).
Naturalmente haverá um método para receber e armazenar mensagens.
Oportunamente esse método será implementado com comunicação entre processos
Recebe pedidos de leitura de mensagens
O nome de um usuário deve vir com o pedido.
Retorna a primeira mensagem cujo destinatário é o usuário fornecido e a remove do sistema.
Naturalmente haverá um método para receber pedidos e retornar mensagens
Oportunamente esse método será implementado com comunicação entre processos
Naturalmente, também, haverá um método para enviar mensagens a outro servidor
Oportunamente esse método será implementado com comunicação entre processos
Parte "quente"
Essa parte ficará mais fácil de compreender depois que estudarmos a Comunicação entre Processos.
A idéia é que em um processo ficará rodando o Servidor e em outro processo, (que precisa estar apto a funcionar em outra máquina) ficará o Cliente.
O cliente deverá receber comandos diretos e se comunicar com o Servidor.
Não queremos que nosso Servidor fique parado à mercê da operação do cliente (transferência de dados, I/O, etc.). Para resolver isso, nosso servidor implementará diferentes threads para cada solicitação do cliente. Dessa forma múltiplos clientes e múltiplas atividades poderão ser executadas ao mesmo tempo.
Note que esse requisito é um tanto especial, já que há a necessidade de se tratar os efeitos colaterais oriundos das prováveis situações de concorrência.
Comandos:
java clienteEmail novoUsuario <nome-do-usuario> => cria o usuario <nome-do-usuario>
java clienteEmail removeUsuario <nome-do-usuario> => remove o usuario <nome-do-usuario>
Obs: se o usuário não for registrado no servidor, então o cliente retorna "Usuario Desconhecido:"<nome-do-usuario>
java clienteEmail nova => pergunta remetente, destinatário e corpo. Cria uma instância do objeto Mensagem e a envia para ser armazenada no servidor
Obs: se o destinatario ou o remetente não forem registrados no servidor, então o cliente retorna "Usuario Desconhecido:"<nome-do-usuario>
java clienteEmail ler <nome-do-usuario> => lê a primeira mensagem de <nome-do-usuario>
java clienteEmail lertodas <nome-do-usuario> => lê todas as mensagens de <nome-do-usuario>
Para essa parte ser implementada, os métodos no servidor precisarão receber requisições remotas (vindas de outro processo, provavelmente de outras máquinas). É a única atividade relevante no projeto, do ponto de vista da disciplina.
O Servidor poderá receber uma mensagem que não é destinada a si mesmo, e sim a outro servidor de e-mail.
java clienteEmail nova => pergunta remetente, destinatário e corpo. Cria uma instância do objeto Mensagem e a envia para ser armazenada no servidor. Mas no caso de destinatário trazer um @host que seja diferente do host onde está rodando o servidor de e-mail, esta mensagem deverá ser encaminhada ao servidor correspondente, e (apenas) lá armazenada para leitura posterior.
Obs: o servidor de destino deverá confirmar ao servidor remetente o recebimento da mensagem.
Obs2: caso a confirmação não se dê num prazo pré-determinado (configurável no servidor), então a mensagem deve ser re-enviada
Obs3: caso a mensagem seja re-enviada um certo número de vezes (configurável no servidor) e não tenha sido recebida, então uma mensagem de erro deve ser gerada pelo servidor ao remetente
Obs4: caso a mensagem seja recebida mais de uma vez por um servidor (como você pretende identificar isto?), as cópias devem ser descartadas.
Observações gerais:
Preveja situações limite, como a chegada de uma mensagem para determinado usuário durante a execução de um procedimento lertodas, o que fará com que a mensagem seja anexada às que estão sendo lidas. Caso um remetente seja excluído, todas as suas mensagens pendentes (ainda não enviadas) devem ser descartadas para evitar tráfego na rede.
Equipes
EQUIPES ESPONTÂNEAS
ALVARO MACIEL CABRAL DANTAS
CLEITON FERNANDO LIMA SENA
DIOGENES VICTOR MEDEIROS RABELO
JOSE BARRETO DOS SANTOS NETO
LEANDRO SOUZA DE OLIVEIRA
MATHEU ANUNCIAÇAO BATISTA DOS SANTOS
RAUL CARDOSO CAVALCANTI ALVES
Lucas
ANUSIO MENEZES CORREIA
ALEX OLIVEIRA DE ANDRADE
MARCOS REIS LOPES
RODRIGO MAGNO BAPTISTA BRAGA
CARLOS DA SILVA DORIA NETO
ALESSANDRO BARBIERI
FERNANDO PIRES DE MELO JUNIOR
FILIPE MARQUES RIBEIRO DRISOSTES
LUIZ MAURICIO NASCIMENTO SILVA
MARCOS PAULO MALTA OLIVEIRA
MARIANNA NOVAES MARTINS
HYAGO SANTANA OTTONI
ARON SEBASTIAN DOS SANTOS SILVA
GERSILINE BEATRIZ SILVA OLIVEIRA
ADRIANA NERY RAMOS
EQUIPES COMPULSÓRIAS
ANA CAROLINA MENDES FIGUEREDO
DANNIEL ARAUJO DE OLIVEIRA
LUIZA MIRANDA GUTERRES
MICHAEL HELDER PAIXÃO CARDOSO
NEMER ALBANO MAGALHÃES MOLLON
PHILIPE DIAS MATTOS
RAFAEL CERQUEIRA COTRIM
ROMARIO BARBOSA REIS
TIAGO CARNEIRO DE OLIVEIRA PEDREIRA
WADSON ARAUJO SOUZA