Obtendo java.rmi.UnmarshalException: hash de método não reconhecido: método não suportado pelo object remoto

Eu sou novo na tecnologia RMI.

Quando estou executando o programa cliente rmi, estou recebendo a exceção: java.rmi.UnmarshalException: método não reconhecido hash: método não suportado pelo object remoto. Estou usando jdk1.5

O argumento do método remoto é o object serializado.

Estes são o código do servidor …

Esta é a interface remota

package interfacepackage; import java.rmi.Remote; import java.rmi.RemoteException; public interface ServerInterface extends Remote{ public void getOrder(Order order) throws RemoteException; } 

Esta é a class de implementação do servidor

 public class ServerImplementation implements ServerInterface { public ServerImplementation() throws RemoteException { } public void getOrderFromCash(Order order) throws RemoteException { System.out.println("WORKED"); } public static void main(String[] args) try { java.rmi.registry.LocateRegistry.createRegistry(1234); ServerImplementation service = new ServerImplementation(); ServerInterface myRemoteObject = (ServerInterface) UnicastRemoteObject .exportObject(service, 0); java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry .getRegistry("localhost", 1234); registry.rebind("ServerImplementation", myRemoteObject); } catch (Exception ex) { ex.printStackTrace(); } } } 

Esta é a ordem da turma

 public class Order implements Serializable{ private static final long serialVersionUID = 1L; private int id; private String name; public Order(int id,String name){ this.id=id; this.name=name; } } 

Eu tenho a mesma class Interface e Order no Client também.

Este é o código do cliente

 public class TestClientProgram { public static void main(String[] args) { try{ java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.getRegistry("localhost",1234); ServerInterface service=(ServerInterface) registry.lookup("ServerImplementation"); Order orderObject=new Order(1,"dish"); service.getOrderFromCash(orderObject); } catch(Exception e){ e.printStackTrace(); } } } 

Alguém poderia me ajudar como posso resolver o problema?

Obrigado antecipadamente Renjith M

A exceção indica que o servidor não consegue localizar o método, que é invocado pelo cliente (a mensagem de erro é um pouco enganadora). Um possível motivo pode ser que o servidor e o cliente estejam executando com caminhos de class diferentes e que o código tenha sido modificado o suficiente para que as interfaces RMI sejam incompatíveis.

Algo está errado aqui. Seu ServerInterface tem um método getOrder , mas a implementação tem getOrderFromCash . Gostaria de verificar se todo o código é compilado e executado com as mesmas versões dessa interface.

Obrigado pela sua resposta. Realmente isso foi um erro do meu lado. O código do cliente é assim:

 public class TestClientProgram { public static void main(String[] args) { try{ java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.getRegistry("localhost",1234); ServerInterface service=(ServerInterface) registry.lookup("ServerImplementation"); Order orderObject=new Order(1,"dish"); service.getOrder(orderObject); } catch(Exception e){ e.printStackTrace(); } } } 

Eu já resolvi o problema.

Eu configurei a variável de ambiente classpath para o diretório raiz da class Order.

Agora eu posso chamar o método remoto do host local.

Mas estou recebendo outra exceção, ao tentar executar o método remoto de outro computador.

Um computador está sendo executado como o servidor (por exemplo: servidor ip é 192.168.1.108). Meu código de cliente é exatamente assim:

 public class TestClientProgram { public static void main(String[] args) { try{ java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.getRegistry("192.168.1.108", 1234); // ServerInterface service = (ServerInterface) registry.lookup("ServerImplementation"); Order orderObject=new Order(12,"DISH"); service.getOrder(orderObject); } catch(NotBoundException e){ System.out.println("NotBoundException"); e.printStackTrace(); } catch(RemoteException e){ System.out.println("RemoteException"); e.printStackTrace(); } } } 

A exceção que estou recebendo é:

 java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: java.net.ConnectException: Connection refused at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601) 

Eu não sei porque esse erro ocorre. Eu sou capaz de ping nos dois computadores e verifiquei a porta no servidor e está tudo funcionando. Os dois computadores estão rodando no Ubuntu. Mas a minha confusão é porque a exceção acima aponta para o ip 127.0.1.1 mesmo que eu esteja conectando ao ip 192.168.1.108 (ip do servidor).

Bem, é uma resposta tardia, mas pode ajudar os novos usuários.

Estou usando o RMI (Cliente e Servidor) eu recebi o mesmo erro e tudo estava correto, mas o que eu perdi é definir a function na interface do servidor, enquanto ela estava definida na interface do Cliente !!

Espero que esta resposta te ajude 🙂

Mas estou recebendo outra exceção, ao tentar executar o método remoto de outro computador. Um computador está sendo executado como o servidor (por exemplo: servidor ip é 192.168.1.108). Meu código de cliente é exatamente assim:

Mesmo sendo um post antigo, posso ter uma solução para o problema se alguém se deparar com ele novamente. Você tem que verificar se o servidor tem o IP correto, verificando o arquivo / etc / hosts. A input com o nome do seu computador deve ter o IP que você definiu para o servidor.