Java sockets e RMI - como fazer?

Um chat usando clientes RMI e Cliente TCP(sockets)

Interface do RMI a suportar pelo servidor.

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServicoChat extends Remote {
public int ligar (String nome, ClienteChat refCliente) throws RemoteException;
public int mensagem (String nome, String msg) throws RemoteException;
public int desligar (String nome) throws RemoteException;
}

Cliente TCP
O cliente TCP comunica com o servidor através de sockets TCP. Sempre que o utilizador escreve uma linha
de texto, essa linha é enviada para o servidor para distribuição pelos restantes clientes. Quando uma linha chega
ao servidor, este usará as ligações TCP estabelecidas para a distribuir aos clientes.
Quando um utilizador pretende ligar-se ao serviço de chat poderá invocar o cliente TCP indicando como
parâmetros de entrada (na linha de comando) os seguintes argumentos:
? Nome que irá identificar o utilizador
? Endereço IP do servidor a utilizar
? Porto do servidor a utilizar
O cliente TCP tenta imediatamente ligar-se ao servidor indicado e assim que essa ligação ficar estabelecida
disponibiliza ao utilizador a possibilidade de introduzir mensagens. Quando o utilizador escrever “sair, o cliente
fecha a ligação ao servidor e termina a sua execução.

Cliente RMI
O cliente RMI comunica com o servidor através de JAVA RMI. Quando um utilizador pretende ligar-se ao
serviço de chat poderá invocar o cliente RMI indicando como parâmetros de entrada (na linha de comando) os
seguintes argumentos:
? Nome que irá identificar o utilizador
? URL rmi: do serviço de chat a utilizar
A primeira tarefa do cliente será estabelecer a ligação com o servidor, invocando o método ligar. De seguida,
sempre que o utilizador escreve uma linha de texto, essa linha é enviada para o servidor para distribuição pelos
restantes clientes, o que é feito através da invocação no servidor do método remoto mensagem. Quando uma
linha chega ao servidor, este usará um interface de callback para a enviar para o cliente, que deverá de seguida
apresentá-la ao utilizador. Para tal o cliente RMI deverá suportar o seguinte interface de callback:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ClienteChat extends Remote
{ public void novaMensagem(String msg) throws RemoteException;
}
Quando o utilizador escrever “sair, o cliente invoca o método desligar no servidor e termina a sua execução.