我是RMI技术的新手。
当我运行rmi客户端程序时,我得到异常:java.rmi.UnmarshalException:无法识别的方法hash:远程对象不支持的方法。 我正在使用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;
}
}
我在Client中也有相同的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
答案 0 :(得分:4)
该异常表示服务器无法找到客户端调用的方法(错误消息略有误导)。一个可能的原因可能是服务器和客户端使用不同的类路径运行,并且代码已经过足够的修改以使RMI接口不兼容。
答案 1 :(得分:2)
这里出了点问题。您的ServerInterface
具有getOrder
方法,但实施方法为getOrderFromCash
。我会检查以确保所有代码都使用该接口的相同版本进行编译和执行。
答案 2 :(得分:0)
在ServerInterface中,应将getOrder替换为getOrderFromCash。
答案 3 :(得分:-1)
这是一个迟到的答案,但它可能有助于新用户。
我正在使用RMI(客户端和服务器) 我得到了同样的错误,一切都是正确的,但我错过的是在服务器界面中定义函数,而它是在客户端界面中定义的!!
我希望这个答案可以帮助你:)