Luiz, vc tem que ter muito claro qual é o seu objetivo.
Fazer uma aplicação distribuída é bem complicado e exige modelagens extensas… digo, pensar muito antes de implementar qq coisa.
Por exemplo, o que é que precisa ser compartilhado: se são só dados, então não tem muito por quê. Se vc quer trocar mensagens entre diversos nós, talvez RMI ajude, talvez atrapalhe e vc prefira usar sockets diretamente.
Quando é que uma aplicação é realmente distribuída?? Quando vc não tem certeza de em qual máquina acontece uma parte do seu programa, e pra vc não importa. Por exemplo, o nfs: vc não precisa saber e nem faz diferença de em qual máquina está o diretório: vc usa como se fosse local. Bem diferente é o sistema de compartilhamento de arquivos do windows, em que vc precisa saber em que máquina está o diretório que vc procura.
O que mais dá trabalho fazer são eventos distribuídos. Mas as aplicações distribuídas geralmente precisam deles. Uma aplicação muito legal que eu vi era uma espécie de PaintBrush compartilhado, onde cada usuário tinha seu próprio cursor. Todos os eventos de mouse eram enviados do cliente de origem para todos os outros clientes. O efeito era espetacular, mas dá um trabalhão.
Seu foco precisa ser muito claro, senão vc vai ter trabalho extra reescrevendo as coisas. Seu back-end pode ser feito com RMI na buena, e fica muito legal. Uma dica: aprenda a usar callbacks… : )
boa sorte e []s