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 2 e no máximo 3 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
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.
Oportunamente adicionaremos mais funcionalidades ao nosso Serviço de Correio Eletrônico.