8

私は RMI テクノロジを初めて使用します。

rmi クライアント プログラムを実行しているときに、次の例外が発生します: java.rmi.UnmarshalException: unrecognized method hash: method not supported by remote object. jdk1.5を使用しています

リモート メソッドの引数は Serialized オブジェクトです。

これらはサーバーコードです...

これはリモートインターフェースです

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

     public void getOrder(Order order) throws RemoteException;
}

これはサーバー実装クラスです

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

        }
    }
}

これはクラスの順序です

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

クライアントにも同じInterfaceとOrderクラスがあります。

これはクライアントコードです

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

問題を解決するにはどうすればよいですか?

前もって感謝します Renjith M

4

4 に答える 4

5

例外は、サーバーがクライアントによって呼び出されたメソッドを見つけることができないことを示します (エラー メッセージは少し誤解を招きます)。考えられる理由の 1 つは、サーバーとクライアントが異なるクラスパスで実行されており、コードが変更されて RMI インターフェースに互換性がないことが考えられます。

于 2009-12-22T15:05:54.757 に答える
3

ここで何かがおかしい。あなたServerInterfaceにはgetOrderメソッドがありますが、実装にはgetOrderFromCash. すべてのコードがそのインターフェイスの同じバージョンでコンパイルおよび実行されていることを確認します。

于 2009-12-22T15:39:16.153 に答える
-1

遅い答えですが、新しいユーザーには役立つかもしれません。

RMI (クライアントとサーバー) を使用していますが、同じエラーが発生し、すべて正しかったのですが、見逃していたのは、クライアント インターフェイスで定義されていた関数をサーバー インターフェイスで定義することでした !!

この回答がお役に立てば幸いです:)

于 2015-03-24T12:18:56.660 に答える