Ajuda com RMI

1 resposta
cleiton_herrmann

Pessoal, ja tentei várias solucoes de outros tópicos e nao consigo descobrir o pq dessa Exception, vou mostrar abaixo a estrutura q tenho e em seguida a Exception

Fiz no netbeans um projeto da aplicacao servidor. Abaixo as classes e códigos que interessam
public interface InterfaceCliente extends Remote {
        public void cadastrarUsuarioNovo(Usuario usuario) throws RemoteException;
}
public interface InterfaceServidor extends Remote {
    public int soma(int a, int b) throws RemoteException;
    public int diminui(int a, int b) throws RemoteException;
}
public class InterfaceServidorImp implements InterfaceServidor, Serializable {

    public InterfaceServidorImp() throws RemoteException {
        super();
    }

    public int soma(int a, int b) throws RemoteException {
        return a + b;
    }

    public int diminui(int a, int b) throws RemoteException {
        return a - b;
    }

}
No construtor da tela inicial que é um JFrame eu seto um novo securitymanager e crio o registro registrando o serviço
public TelaInicial() {
    try {
        initComponents();           

        System.setSecurityManager (new RMISecurityManager() {
            public void checkConnect (String host, int port) {}
            public void checkConnect (String host, int port, Object context) {}
        });

        InterfaceServidor servico = new InterfaceServidorImp();
        Registry registro = LocateRegistry.createRegistry(1098);
        registro.bind("servicosRemotos", servico);
    } catch (Exception ex) {
        ex.printStackTrace();
        new ExibirExcessao(null, true, ex).setVisible(true);
    }
}
Essa é a aplicação servidora que fica executando na maquina 192.168.55.217, ela inicia normalzinho, eu até tinha conseguido obter o resultado dos métodos soma e diminiu, mas derrepente começou a dar uma excessão, que nao estou conseguindo resolver. Bom, vamos agora para a aplicação cliente, que é outro projeto no netbeans, são duas aplicações separadas. Essa eu estou executando na maquina 192.168.55.218. Abaixo as classes e códigos que interessam.
public interface InterfaceCliente extends Remote {
        public void cadastrarUsuarioNovo(Usuario usuario) throws RemoteException;
}
public class InterfaceClienteImp implements InterfaceCliente,Serializable {

    public InterfaceClienteImp() throws RemoteException {}

    public void cadastrarUsuarioNovo(Usuario usuario) throws RemoteException {}
}
public interface InterfaceServidor extends Remote {
    public int soma(int a, int b) throws RemoteException;
    public int diminui(int a, int b) throws RemoteException;    
}
E no construtor da tela inicial da aplicação cliente, eu inicio o servidor local para alguns servicos da aplicação cliente, e tento usar os servicos da aplicação servidor(metodos soma e diminiu)
public TelaInicial() {
    try {
        initComponents();

        System.setSecurityManager (new RMISecurityManager() {
            public void checkConnect (String host, int port) {}
            public void checkConnect (String host, int port, Object context) {}
        });
        InterfaceCliente servicosCliente = new InterfaceClienteImp();
        Registry registroLocal = LocateRegistry.createRegistry(1099);
        registroLocal.bind("servicosLocais", servicosCliente);
            
        int a = 5;
        int b = 5;

        Registry registroRemoto = LocateRegistry.getRegistry(ipServidor, 1098);
        InterfaceServidor servicosRemotos = (InterfaceServidor)registroRemoto.lookup("servicosRemotos");
        int resultadoSoma = servicosRemotos.soma(a, b);
        int resultadoSubtracao = servicosRemotos.diminui(a, b);
        System.out.println("soma: " + resultadoSoma + "\nsubtracao: " + resultadoSubtracao);

    } catch (Exception ex) {
        ex.printStackTrace();
        new ExibirExcessao(null, true, ex).setVisible(true);
    }
}
E a exception q está sendo lançada é a seguinte:
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFException at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:209) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) at TelaInicial.(TelaInicial.java:45) at Main.main(Main.java:46) Caused by: java.io.EOFException at java.io.DataInputStream.readByte(DataInputStream.java:250) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:195) ... 4 more
Só pra deixar mais claro, a linha "at TelaInicial.(TelaInicial.java:45)" da stacktrace, é referente a linha 17 do código acima, ou seja, o servidor foi encontrado, nao houve nenhuma excessão de acesso negado. Já nao sei mais o q tentar pra resolver esse problema... Alguem tem uma ideia do que estou fazendo errado ou do que esta faltando ? Desde já grato ! t+

1 Resposta

cleiton_herrmann

Pessoal, ja tentei usar aquele arquivo de politica de segurança, permitindo todas as conexoes, client.policy e server.policy, passando como argumento dos meus servidor.jar e cliente.jar -Djava.security.policy=client.policyo conteudo dos arquivos é grant { // Allow everything for now permission java.security.AllPermission; };e os arquivos ficam no mesmo diretorio onde está o .jar, pensei que pudesse ser algo de permissão de acesso, que estivesse bloqueando o acesso aos objetos impedindo de fazer o marchal e/ou unmarchal, mas acho que nao tem nada a ver na verdade.

Alguma idéia ?

Criado 12 de abril de 2011
Ultima resposta 13 de abr. de 2011
Respostas 1
Participantes 1