2009-12-22 9 views
4

Je suis nouveau à la technologie RMI.Obtenir java.rmi.UnmarshalException: hachage méthode non reconnue: méthode non prise en charge par l'objet distant

Lorsque j'exécute le programme client rmi, j'obtiens l'exception: java.rmi.UnmarshalException: méthode non reconnue hash: méthode non prise en charge par l'objet distant. J'utilise jdk1.5

L'argument de la méthode à distance est l'objet sérialisé.

Ce sont le code du serveur ...

Ceci est l'interface à distance

package interfacepackage; 
import java.rmi.Remote; 
import java.rmi.RemoteException; 
public interface ServerInterface extends Remote{ 

    public void getOrder(Order order) throws RemoteException; 
} 

Ceci est la classe d'implémentation du serveur

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(); 

     } 
    } 
} 

Voici l'ordre de classe

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; 
} 
} 

J'ai la même classe d'interface et de commande dans le client également.

Ceci est le code client

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();  
     } 
     } 
    } 

Quelqu'un pourrait-il me aider à comment puis-je résoudre le problème?

Merci à l'avance Renjith M

+0

Avez-vous commencé à répondre? –

Répondre

4

L'exception indique que le serveur ne parvient pas à trouver la méthode qui est invoquée par le client (le message d'erreur est légèrement trompeur). Une raison possible peut être que le serveur et le client s'exécutent avec des chemins de classes différents et que le code a été suffisamment modifié pour que les interfaces RMI soient incompatibles.

1

Quelque chose ne va pas ici. Votre ServerInterface a une méthode getOrder mais la mise en œuvre a getOrderFromCash. Je vérifierais pour s'assurer que tout le code est compilé et exécuté avec les mêmes versions de cette interface.

0

Merci pour votre réponse. Ce qui était une erreur de mon côté. Le code client est comme ceci:

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(); 
    } 
    } 
} 

J'ai résolu le problème.

J'ai mis la variable d'environnement classpath dans le répertoire racine de classe Order.

Maintenant, je suis en mesure d'appeler la méthode à distance de l'hôte local.

Mais je reçois d'autres exceptions, en essayant d'exécuter la méthode à distance à partir d'un ordinateur différent.

Un ordinateur est en cours d'exécution en tant que serveur (par exemple, l'adresse IP du serveur est 192.168.1.108). Mon code client est exactement comme ceci:

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(); 
} 
} 
} 

L'exception que je reçois est:

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) 

Je ne sais pas pourquoi cette erreur se produit. Je suis capable de faire un ping sur les deux ordinateurs et vérifié le port dans le serveur et tout fonctionne. Les deux ordinateurs fonctionnent sous Ubuntu. Mais ma confusion est pourquoi l'exception ci-dessus pointe vers l'adresse IP 127.0.1.1 même si je me connecte à l'IP 192.168.1.108 (ip du serveur).

-1

Mais je reçois d'autres exceptions, en essayant d'exécuter la méthode à distance à partir d'un ordinateur différent. Un ordinateur est en cours d'exécution en tant que serveur (par exemple, l'adresse IP du serveur est 192.168.1.108). Mon code client est exactement comme ceci:

Même s'il s'agit d'un ancien article, je peux avoir une solution au problème si quelqu'un y retourne à nouveau. Vous devez vérifier si le serveur a la bonne adresse IP en vérifiant le fichier/etc/hosts. L'entrée avec le nom de votre ordinateur doit avoir l'adresse IP que vous avez définie sur le serveur.

0

Eh bien c'est une réponse tardive, mais il peut aider les nouveaux utilisateurs. J'utilise RMI (Client et Serveur) J'ai eu la même erreur et tout était correct, mais ce que j'ai manqué est de définir la fonction dans l'interface du serveur, alors qu'elle était définie dans l'interface Client !!

J'espère que cette réponse va vous aider :)

Questions connexes