AJUDA! Exception com RMI

2 respostas
marianalarab
Exception:

java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:

java.net.SocketException: Connection reset

at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)

at sun.rmi.server.UnicastRef.invoke(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)

at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)

at $Proxy0.selectComp(Unknown Source)

O meu RMI consegue a conexão, mas quando vou chamar uma funcionalidade o erro ocorre.
Alguém já passou por isso???

Obrigada

INTERFACE:
public interface InterfaceServidorRMI extends java.rmi.Remote{

//Executa comandos Svn
public int execute(String comando)throws RemoteException;

//Tabela de arquivos
public List<Arquivo> selectArq(final BuscaTermos transferObject)throws RemoteException;

}

SERVER:

public class ServidorNomesRMI extends UnicastRemoteObject implements InterfaceServidorRMI{

/**
 * 
 */
private static final long serialVersionUID = 1L;

  public static void main(String[] args) {
	try {			
        ServidorNomesRMI im = new ServidorNomesRMI();
        System.err.println("\n\nDateServidor começando...");
        Registry r = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        Naming.rebind("trafegaServidor", im);
        System.err.println("DateServido pronto no endereço: " + java.net.InetAddress.getLocalHost().getHostAddress());
    } catch (Exception e) {
        System.err.println(e);
        System.exit(1);
    }
}
public List<Arquivo> selectArq(BuscaTermos transferObject) {

ResultSet rs = null;

List<Arquivo> lista = new ArrayList<Arquivo>();

Connection conn = null;

PreparedStatement stmt = null;

String statement = null;

try {

conn = BDUtils.getConection();

statement = "SELECT " +

"IDARQUIVO, " +

"CAMINHO " +									

"FROM ARQUIVO WHERE " +

transferObject.getBuscapor() +

" = ? ";

System.out.println(statement);
stmt = conn.prepareStatement( statement );
        stmt.setString(1, transferObject.getTermos());
        rs = stmt.executeQuery();
        
        
        try {        	
			while(rs.next()){
				Arquivo arquivo = new Arquivo();				
				
				arquivo.setIdArquivo(rs.getInt("IDARQUIVO"));
				arquivo.setCaminho(rs.getString("CAMINHO"));
				
				lista.add(arquivo);
			}
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
    } catch (Exception e) {

		e.printStackTrace();
    } finally {
        try {
            if ( stmt != null ) {
                stmt.close();
            }
            if ( conn != null ) {
                conn.close();
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    
    
	return lista;
    
}


CLIENTE:

private boolean conectar( String ipSN ) {

System.out.println(INICIANDO int conectar( + ipSN + ));

try {

is = (InterfaceServidorRMI)Naming.lookup(rmi://” + ipSN + “/trafegaServidor”);

System.out.println(chamou o RMI do SERVIDOR\n);
//ComponenteDAO c = new ComponenteDAO();
        BuscaTermos bt = new BuscaTermos();
        bt.setBuscapor("Caminho");
        bt.setTermos("");
        List&lt;Arquivo&gt; lista = is.selectArq(bt); //Exception ocorre nesta linha******************************************* &lt;--
        
        for ( Arquivo i : lista ){
        	String comando = "svnserve -d -r C:\\" + i.getCaminho() + " --listen-port " + i.getPorta();
        	ThreadServerSvn thread = new ThreadServerSvn("Inicia",comando,is);
        	thread.start();
        }
        
    } catch (MalformedURLException ex) {
        ex.printStackTrace();
        System.out.println("erro no RMI do SERVIDOR\n");
        return false;
    } catch (RemoteException ex) {
        ex.printStackTrace();
        System.out.println("erro no RMI do SERVIDOR\n");
        return false;
    } catch (NotBoundException ex) {
        ex.printStackTrace();
        System.out.println("erro no RMI do SERVIDOR\n");
        return false;
    }
    return true;
}

O BEAN Arquivo está assim, e está presente tanto no projeto cliente quanto servidor. Dentro de pacotes com mesmo nome, assim como a interface.

public class Arquivo implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = -7316253179873091202L;
private int IdArquivo;
private String Caminho;

public int getIdArquivo() {
	return IdArquivo;
}
public void setIdArquivo(int idArquivo) {
	IdArquivo = idArquivo;
}
public String getCaminho() {
	return Caminho;
}
public void setCaminho(String caminho) {
	Caminho = caminho;
}

}

Talvez seja porque estou tentando enviar uma lista do Server para o CLiente RMI!!! Se alguem tiver um exemplo usando lista já ajuda!

2 Respostas

marianalarab

Resolvi o problema.
Todas as classes que eram compartilhadas pelo cliente e servidor eu inseri em um outro projeto.
Assim ficou:
–> Projeto do Servidor com a interfaceRMI, e a implementação da interface.
–> Projeto do cliente, executando apenas as funções do cliente mesmo
–> Projeto Interface, que possui todas as classes em comum do cliente e do servidor, exceto a interfaceRMI.

No eclipse, que era o que eu estava usando. Eu inslui um projeto dentro do outro, da seguinte forma:

  • Clica com o botão direito no Projeto Servidor, vai em Configure Buid Path, aba de Projetos. ADD Projeto Interface.
  • Botão Direito no Projeto de Cliente, configure build path, aba de projetos, add Projeto Interface e Projeto Servidor

Funcionou Comigo. Respondi eu mesma aqui caso alguém passe pelo mesmo problema =)

[]'s

Gobain

Não esqueça que todas as classes dos objetos q vc pretende transferir entre cliente e servidor tem que implementar java.io.Serializable.
Outra coisa, coloque seu código entre [ code] [ /code], fica melhor de ler para poder ajudar :thumbup:

Criado 29 de outubro de 2008
Ultima resposta 29 de out. de 2008
Respostas 2
Participantes 2