Este projeto implementa um sistema distribuído de chat de grupo com java RMI e sockets.
O sistema é escalável em uma rede com suporte a multicast. Ele é composto por uma quantidade variada de nós, que pode ser ajustada de acordo com a demanda.
Cada nó do sistema distribuído tem:
- Um host rodando RMIREGISTRY
- Um host (pode ser o mesmo do RMIREGISTRY ou não) rodando o servidor da aplicação (servidor socket multicast, servidor RMI para enviar mensagens e cliente RMI para enviar mensagens recebidas do socket para os seus clientes)
- Vários hosts rodando cliente (sistema com UI interativa, que se comunica com o servidor)
Abaixo uma imagem represntando a arquitetura de um nó:
Todo endereçamento IP e portas da aplicação foram deixados em um arquivo de configuração (config.json) que é lido em runtime para flexibilidade da aplicação de rodar em diferentes hosts. Isso inclui o IP e porta do RMIREGISTRY e o IP e porta do servidor socket multicast.
Como terão múltiplos servidores RMI (servidor da aplicação e os clientes), foi adotado um padrão de nome de registro no RMIREGISTRY:
- Servidor da aplicação tem o nome MessageServer
- Cada cliente pede um username ao usuário ao iniciar a aplicação e usa esse nome no seguinte padrão: MessageClient_<username>
Para o servidor socket multicast enviar uma mensagem recebida para todos os seus clientes, ele lista todos os registros do RMIREGISTRY e manda para todos excluindo o seu próprio (MessageServer).
Dessa forma, vale lembrar que apenas um, e exatamente um, servidor da aplicação deve estar rodando em um nó do sistema distribuído.
O projeto foi feito em Java 8 com Maven.
Para rodar o projeto, siga os seguintes passos:
Sem maven (em ambiente linux com make)
-
Cheque se você tem uma pasta "bin/dependencies" com as dependências do projeto. Caso não, crie-a!
-
(Opcional) Rebuildar a partir do código-fonte:
$ make clean-build
- Startar rmiregistry (A porta 9925 será usada. Está definida no arquivo config.json e Makefile):
$ make run-rmiregistry
- Rodar servidor (arquivo config.json deve estar definido na pasta corrente):
$ make run-server
- Rodar o cliente (em outro terminal):
$ make run-client
- Buildar o projeto:
$ mvn clean install
- Setar classpath para o JAR gerado pelo maven em target:
$ export CLASSPATH=target/rmi-group-chat-1.0-SNAPSHOT.jar
- Startar rmiregistry (9925 é a porta que está no arquivo config.json):
$ rmiregistry 9925 &
- Rodar servidor:
$ java rmigroupchat.rmi.MessageServer
- Rodar o cliente (em outro terminal, lembrar de setar o classpath):
$ java rmigroupchat.rmi.MessageClient