Busca por RMI

4 respostas
L

Tenho um Cliente que faz uma busca no Servidor por nome, idade, sexo, cargo e faixa salarial. Consigo publicar o serviço pelo servidor o meu problema aparece quando vou rodar o meu Cliente

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Cliente.IServico
Cliente:
public class Cliente {
    
    
    public static void main(String[] args) throws RemoteException, NotBoundException {
        
        List<Funcionario> func = new ArrayList();
        
        Registry r = LocateRegistry.getRegistry("localhost", 1099);
        
        IServico serv = (IServico) r.lookup("servico"); // aqui que dá erro
        
        func = serv.buscarPorNome("Erick");;
        
        System.out.println(func);
    }
}

IServico:

public interface IServico extends Remote {
    
    List<Funcionario> buscarPorNome(String nome) throws RemoteException;
    List<Funcionario> buscarPorIdade(int idade) throws RemoteException;
    List<Funcionario> buscarPorSexo(String sexo) throws RemoteException;
    List<Funcionario> buscarPorCargo(String nome) throws RemoteException;
    List<Funcionario> buscarPorSalario(int salMenor, int salMaior) throws RemoteException;
    
    
}

Servidor:

public class Servidor {
    public static void main(String[] args) throws IOException {
        
        //System.setProperty("java.rmi.server.hostname", "192.168.0.131"); 
        
        List<Funcionario> list = Servidor.carregarFuncionarios("Arquivo.txt");
        
        Registry r = LocateRegistry.createRegistry(1099);
        
        r.rebind("servico", new Servico(list));
        
        System.out.println("Servico Publicado");
        
    }
    
    public static List<Funcionario> carregarFuncionarios(String arquivo) throws IOException{
        File file = new File(arquivo);
        List<Funcionario> temp = new ArrayList();
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String[] linha;
            
            String aux;
            
            while((aux = br.readLine()) != null){
                linha = aux.split("\\s");
                
                Funcionario func = new Funcionario(linha[0],
                        Integer.parseInt(linha[1]), 
                        linha[2], 
                        linha[3], 
                        Double.parseDouble(linha[4]));
//                for(String f : linha){
//                    System.out.println(f);
//                }
                
                temp.add(func);
                
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return temp;
        
    }
    
}

E implemento o metodo de buscar o nome, idade.. na classe Servico
Alguma sugestao?

4 Respostas

J

Ao que tudo indica o ClassCastException esta sendo lançada porque voce esta tendando isso…

IServico serv = (IServico) r.lookup("servico"); // aqui que dá erro

Ou seja o r.lookup(“servico”); nao pode ser um IServico ou nao poder ser “convertido”

L

Agora o pq…? Se eu implementei a interface IServico e consigo publicar ela no servidor… Alguma ideia do que eu poderia fazer?

L

Consegui resolver o problema agora entrei em outro..

quando tento fazer uma pesquisa pelo nome gera esse erro:

Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: Servidor.Funcionario
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:191)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
	at com.sun.proxy.$Proxy0.buscarPorNome(Unknown Source)
	at Servidor.Cliente.main(Cliente.java:25)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: Servidor.Funcionario
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	at java.util.ArrayList.readObject(ArrayList.java:733)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1872)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1777)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:324)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173)
	... 4 more
Caused by: java.io.NotSerializableException: Servidor.Funcionario
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at java.util.ArrayList.writeObject(ArrayList.java:710)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:292)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:332)
	at sun.rmi.transport.Transport$1.run(Transport.java:177)
	at sun.rmi.transport.Transport$1.run(Transport.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)

Na classe Servico ele faz a pesquisa numa boa

public class Servico extends UnicastRemoteObject implements IServico {
    
    private List<Funcionario> lista = new ArrayList();
    
    public Servico(List<Funcionario> lista) throws RemoteException{
        super();
        this.lista = lista;
    }

    @Override
    public List<Funcionario> buscarPorNome(String nome) throws RemoteException {
        List<Funcionario> temp = new ArrayList();
        
        for (Funcionario func : lista) {
            if(func.getNome().equalsIgnoreCase(nome)){
                temp.add(func);
                System.out.println(func.getNome() + func.getEmail() + func.getSexo() + func.getCargo());
            }            
        }
        return temp;
    }
}

mas nao chega a retornar pro cliente

E

Vocẽ precisa declarar as classes envolvidas serializáveis

class Cliente implements java.io.Serializable

O mesmo vale para funcionário.

Criado 24 de maio de 2013
Ultima resposta 27 de mai. de 2013
Respostas 4
Participantes 3