Replicação de Servidores - RMI

Boa Noite,
Estou fazendo um trabalho da faculdade, e o processor pediu para fazer a replicação no servidor.
Ele disse que pode ser qualquer informação, não necessariamente precisa fazer parte do sistema.
Desde já obrigado a todos.

Segue classe Cliente:

import java.awt.HeadlessException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import javax.swing.JOptionPane;

public class Cliente {

public static void main(String[] args) throws HeadlessException, NumberFormatException, RemoteException {

	Interface controlador = null;
	Servidor2 server2=null;

// ------------ - - - - - - - - - - - - - - - - Inicio: Escolha de Servidor ------------ - - - - - - - - - - - - - - - -

	Object[] servidor = { "Servidor 1", "Servidor 2" };
	Object opcao = JOptionPane.showInputDialog(null, "Qual servidor?", "Servidores", JOptionPane.QUESTION_MESSAGE,
			null, servidor, servidor[0]);

	/* ESCOLHA DO SERVIDOR */

	try {
		if (opcao == servidor[0]) {
			controlador = (Interface) Naming.lookup("//localhost/rmi");
			controlador.setCont();
			System.out.println(controlador.getCont());
		//	JOptionPane.showMessageDialog(null, "Conectado ao servidor 1.");

		} else if (opcao == servidor[1]) {
			controlador = (Interface) Naming.lookup("//localhost/srv");
			controlador.setCont();
			System.out.println(controlador.getCont());
		//	JOptionPane.showMessageDialog(null, "Conectado ao servidor 2.");
		}
	} catch (Exception e) {
		System.err.println("Erro: " + e);
		e.printStackTrace();
	}

// ------------ - - - - - - - - - - - - - - - - Fim da Escolha de Servidor ------------ - - - - - - - - - - - - - - - -

// ------------ - - - - - - - - - - - - - - - - Inicio do Cliente 1 ------------ - - - - - - - - - - - - - - - -

	int mensagem = 0;
	
	while (controlador.getCont() < 2) {
		if (mensagem < 1) {
			JOptionPane.showMessageDialog(null, "Aguardando conexão do outro Cliente", "Menssagem", JOptionPane.WARNING_MESSAGE);
			System.out.println("Aguardando conexão do outro cliente.");
			
			
		}
		mensagem = 1;
		}

	
	if(controlador.clientRole() == 0){
					
		try {
			while(true) {
			controlador.incrementarCliente();
			String comp = JOptionPane.showInputDialog(null, "Digite o comprimento do paralelepípedo: ", "CLIENTE 1", JOptionPane.PLAIN_MESSAGE);
			controlador.setComprimento (Float.parseFloat(comp));
			//JOptionPane.showMessageDialog(null, "Valor do Comprimento: "+controlador.getComprimento());
			System.out.println("Aguardando parametros do segundo cliente.");
			JOptionPane.showMessageDialog(null, "Aguardando parametros do segundo cliente.", "CLIENTE (1)", JOptionPane.WARNING_MESSAGE);
		
			
			while(true) {	        					
				if(controlador.getLargura() == -9999) {
					
				} else {
			String altura = JOptionPane.showInputDialog(null, "Digite o valor da altura do paralelepípedo: ", "CLIENTE 1", JOptionPane.PLAIN_MESSAGE);
			controlador.setAltura(Float.parseFloat(altura));
			//JOptionPane.showMessageDialog(null, "Valor da altura: "+controlador.getAltura());
			
			break;
				}
			}	 				
			
				        					
				while(true) {
					if(controlador.getLargura() == -9999 ) {
					}else {
						JOptionPane.showMessageDialog(null,"Cliente 1 digitou o Comprimento "+controlador.getComprimento()+" e a altura "+controlador.getAltura()+" e o valor do volume do paralelepípedo é "+controlador.getCalcula(), "CLIENTE 1" , JOptionPane.INFORMATION_MESSAGE);
					break;
				}
		}
				
				try {			
					
					controlador.resetar();
					break;
					
				} catch (Exception e) {
					JOptionPane.showMessageDialog(null, "Digite um valor válido! ", "CLIENTE 2", JOptionPane.ERROR_MESSAGE);
				}
		/*	try {
				String cont1 = JOptionPane.showInputDialog(null, "Deseja continuar? \n Digite 1 para sim \n Digite 0 para não", "CLIENTE 1", JOptionPane.PLAIN_MESSAGE);
				controlador.setContinua1(Integer.parseInt(cont1));
			if (controlador.getContinua1() == 1){
			}else if (controlador.getContinua1() == 0){
				controlador.incrementarCliente();
				break;
			} else {
				JOptionPane.showMessageDialog(null,"Valor invalido... saindo", "CLIENTE (2)" , JOptionPane.INFORMATION_MESSAGE);
				controlador.incrementarCliente();
				break;
			}
			} catch (Exception e){
				JOptionPane.showMessageDialog(null, "Por favor, entre apenas com números (No caso: 0 ou 1).", "Opção Inválida", JOptionPane.ERROR_MESSAGE);
			}*/
		}
	

			

		} catch (RemoteException re) {
			System.err.println("Problemas com a chamada remota! " + re);
			re.printStackTrace();
			System.exit(3);
		}

// ------------ - - - - - - - - - - - - - - - - Fim do Cliente 1 ------------ - - - - - - - - - - - - - - - -

// ------------ - - - - - - - - - - - - - - - - Inicio do Cliente 2 ------------ - - - - - - - - - - - - - - - -

	} else {
				
try {	        
		 while(true) {
			 controlador.incrementarCliente();
			 if (controlador.getComprimento() == -9999){
					System.out.println("Aguardando parametros do primeiro cliente.");
					JOptionPane.showMessageDialog(null, "Aguardando parametros do primeiro cliente.", "CLIENTE 2", JOptionPane.WARNING_MESSAGE);
			 }
			 while(true){
			if (controlador.getComprimento() == -9999) {
			
			}else{
				
				String largura = JOptionPane.showInputDialog(null, "Digite a largura do paralelepípedo: ", "CLIENTE 2", JOptionPane.PLAIN_MESSAGE);
				controlador.setLargura(Float.parseFloat(largura));
				//JOptionPane.showMessageDialog(null, "Valor da largura: " +controlador.getLargura());	
				System.out.println("Aguardando ultimo valor para ecibição do resultado .");
				JOptionPane.showMessageDialog(null, "Aguardando ultimo valor digitado pelo cliente 1 para exibição do resultado ", "CLIENTE (2)", JOptionPane.WARNING_MESSAGE);
			
			break;			
		}
			
			 	}
	
			 while(true) {	        					
					if(controlador.getAltura() == -9999) {
					} else {
						//JOptionPane.showMessageDialog(null,"Cliente 2 digitou a largura "+controlador.getLargura()+" e o valor do volume do paralelepípedo é "+(controlador.getComprimento() * controlador.getLargura()* controlador.getAltura()), "CLIENTE 2" , JOptionPane.INFORMATION_MESSAGE);
						JOptionPane.showMessageDialog(null,"Cliente 2 digitou a largura "+controlador.getLargura()+" e o valor do volume do paralelepípedo é "+controlador.getCalcula(), "CLIENTE 2" , JOptionPane.INFORMATION_MESSAGE);
						break;
					}
					}
		try {			
			
			controlador.resetar();
			break;
			
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Digite um valor válido! ", "CLIENTE 2", JOptionPane.ERROR_MESSAGE);
		}
	} while(true);
	
	/*	try {
	String cont2 = JOptionPane.showInputDialog(null, "Deseja continuar? \n Digite 1 para sim \n Digite 0 para não", "CLIENTE 1", JOptionPane.PLAIN_MESSAGE);
	controlador.setContinua2(Integer.parseInt(cont2));
if (controlador.getContinua2() == 1){
}else if (controlador.getContinua2() == 0){
	controlador.incrementarCliente();
	break;
} else {
	JOptionPane.showMessageDialog(null,"Valor invalido... saindo", "CLIENTE (2)" , JOptionPane.INFORMATION_MESSAGE);
	controlador.incrementarCliente();
	break;
}
} catch (Exception e){
	JOptionPane.showMessageDialog(null, "Por favor, entre apenas com números (No caso: 0 ou 1).", "Opção Inválida", JOptionPane.ERROR_MESSAGE);
}*/

} catch (RemoteException re) {
	System.err.println("Problemas com a chamada remota! " + re);
	re.printStackTrace();
	System.exit(3);

	//JOptionPane.showMessageDialog(null,"O Cliente 1 informou o valor:  " +controlador.getComprimento()+ " de comprimento e o valor " +controlador.getLargura()+ " e o  volume do paralelepipedo será: " +controlador.getAltura() * controlador.getComprimento() * controlador.getLargura(), "CLIENTE 1" , JOptionPane.INFORMATION_MESSAGE);
	//JOptionPane.showMessageDialog(null,"O Cliente 2 informou o valor:  " +controlador.getLargura()+ " de altura e o valor do volume do paralelepipedo será: " +controlador.getAltura() * controlador.getComprimento() * controlador.getLargura(), "CLIENTE 2" , JOptionPane.INFORMATION_MESSAGE);

//------------ - - - - - - - - - - - - - - - - Fim: Cliente (2) ------------ - - - - - - - - - - - - - - - -
}
}}

	}