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.