Exception RMI

1 resposta
F

Pessoal, boa tarde!

Estou fazendo um programa em java cliente servidor(BD e aplicação no mesmo server).

E quando tento fazer o logon do cliente no servidor, vem um erro de rmi. já tentei de tudo e não consigo resolver, já pesquisei em todos os foruns e sites possíveis e mesmo assim nenhuma das resoluções divulgadas resolveram meu código.

Segue código do servidor:

public static void main (String[] args){
		
		System.setProperty("java.rmi.server.codebase","file:///c:/WorkspaceEclipse/MeuSoftware/bin/");
		
		try{
			janelaserver = new Principal();
			
			InterfaceImplementada stub = new InterfaceImplementada (janelaserver);
			Interface servico = (Interface )UnicastRemoteObject.exportObject(stub,0);
			Registry registry = LocateRegistry.createRegistry(1000);
			registry.rebind("comunicaserver", servico);	
			
			janelaserver.initMenu();
		    janelaserver.initComponents();
		    janelaserver.setVisible(true);
		}catch(Exception ex){
			ex.printStackTrace();
			JOptionPane.showMessageDialog(null,"Problemas na execução do servidor: "+ex,"Erro",JOptionPane.ERROR_MESSAGE);
		}

...e no cliente:

try{
				   ip = JOptionPane.showInputDialog(null,"Informe o nome ou ip do servidor:","Server Conect - IP",JOptionPane.QUESTION_MESSAGE);
				   port = JOptionPane.showInputDialog(null,"Informe a porta do servidor:","Server Conect - Port",JOptionPane.QUESTION_MESSAGE);
				   srv = (Interface) Naming.lookup( "rmi://"+ip+":"+port+"/comunicaserver" );
				   }
			   catch(Exception ex){
				   JOptionPane.showMessageDialog(null,"Falha na conexão ao servidor.","Atenção",JOptionPane.WARNING_MESSAGE);
			   }

//Código do evento do botão logar do cliente:
						try {
						boolean logou = srv.Logon(txflogin.getText().toLowerCase(),passwordfield.getText());
							if (logou == true){
								setVisible(false);
								Frame_Client janelaclient = new Frame_Client(srv.getUsuario(txflogin.getText().toLowerCase()), ip, port, srv);
								janelaclient.initMenu();
								janelaclient.initComponents();
							}else{
								JOptionPane.showMessageDialog(null,"Falha ao tentar autenticar o usuário "+txflogin.getText()+"\n\nUsuário ou senha inválida!","Atenção",JOptionPane.ERROR_MESSAGE);
							}
						} catch (Exception e1){
							e1.printStackTrace();
							JOptionPane.showMessageDialog(null,"Falha ao tentar se conectar ao servidor.","Erro",JOptionPane.ERROR_MESSAGE);
						}

o método do botão logar "srv.logon" está implementado na classe de implementação da interface RMI no servidor e consulta o banco de dados para verificar o usuário e senha se está valido. Caso esteije, retorna True, se não retorna FALSE.

A exception q está ocorrendo é a seguinte:

java.rmi.NoSuchObjectException: no such object in table
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
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.Logon(Unknown Source)...
... (continua com aquele mar de linhas vermelhas rss...)

Alguem tem alguma dica?

1 Resposta

moacirjava
Dá uma olhada nesse exemplo, vê se te ajuda...
public class Servidor {
    
    
    public static void main(String[] args) {
        try{
            Interface servico = new InterfaceImp();
            Registry registro = LocateRegistry.createRegistry(1000);//porta.
            registro.bind("Soma",servico);// "soma" eh o nome dado para esse servico.
            registro.bind("qualEmaior",servico);// "qualEmaior" eh o nomde dado para esse servico.
            registro.bind("somaMaisUm",servico);// a mesma coisa aqui.
            
            
            } catch (RemoteException ex) {
                ex.printStackTrace();
            } catch (AlreadyBoundException ex) {
                ex.printStackTrace(); }
        }
            
}
public class Cliente {
    
    private static int a, b;
    
    /** Creates a new instance of Cliente */
    public Cliente() {
    }
    
    public static void main(String[] args){
        try {
            a = 2;
            b = 5;
            System.out.println("Numero a=" + a + " b=" + b);
            Registry registro = LocateRegistry.getRegistry("192.168.0.2",1000);//localhost ou 127.0.0.1 .
            Interface servico = (Interface)registro.lookup("Soma");          
            int resultado = servico.soma(a,b);                        
            System.out.println("O resultado do metodo soma: " + resultado);
            
            servico = (Interface)registro.lookup("qualEmaior");
            resultado = servico.qualEmaior(a,b);
            System.out.println("O resultado do metodo qualEmaior: " + resultado);
            
            servico = (Interface)registro.lookup("somaMaisUm");
            resultado = servico.somaMaisUm(a,b);
            System.out.println("O resultado do metodo somaMaisUm: " + resultado);
            
            
        } catch (RemoteException ex) {
            ex.printStackTrace();
        } catch (NotBoundException ex) {
            ex.printStackTrace();
        }
    }
}
Criado 22 de fevereiro de 2009
Ultima resposta 22 de fev. de 2009
Respostas 1
Participantes 2