Vou te falar bem geralzão como dá pra fazer. Mas garanto que já existem coisas assim prontas. Eu mesmo, na faculdade, fiz um toscão, mas com CORBA e não com RMI. Se vc for tentar mesmo fazer o seu, eu tenho umas dicas de quem esteve lá pra vc…
Abstraindo bem, vc precisa de 3 partes: o “cliente que envia”, o “cliente que recebe” e o “servidor”, uma espécie de serviço de nomes e gerenciador de mensagens.
O melhor é vc ter um objeto conhecido (isto é, com um registri RMI conhecido) com métodos do tipo:
public User login(String username, String password);
public List getAvailableUsers();
public void sendMessage(Message message);
E enviar as mensages pelo servidor, e não diretamente entre os clientes.
Basicamente dois objetos viajam pela rede: um User e um Message. Assim vc deixa o protocolo fora do RMI, e pode mexer o quanto quiser nele.
Vc tem duas abordagens, push e pull. Com push, o servidor deve poder fazer conexão com os clientes, e as mensagens são enviadas assim que possível. Com pull, os clientes puxam as mensagens de tempos em tempos. A implementação no servidor central muda bastante:
// exemplo de push:
// 1. método no servidor:
public void addMessageListener(User user, MessageListener listener);
// 2. o cliente se registra assim:
server.addMessageListener(this.getUser(), this);
// exemplo de pull:
// 1. método no servidor:
public List getMessages(User user);
// 2. o cliente, de tempos em tempos, puxa todas as mensagens:
List newMessages = server.getMessages(this.getUser());
Eu escolhi pull por simplicidade do servidor, além de poder guardar mensagens enviadas offline mais facilmente, por isso eu devolvia todos os usuários no getAvailableUsers(). Também tem o problema do firewall: pra usar push, vc precisa de callbacks RMI, isto é, vc precisa de objetos RMI exportados ouvindo conexões TCP em cada cliente, e isto pode dar dores de cabeça com o firewall…
Uma coisa que eu acabei implementando na mão e sugiro que vc não faça é a parte de sincronização. use o pacote util.concurrent do Doug Lea (procure “util.concurrent” no Google, é fácil de achar).
boa sorte!!!
[]s