Java RMI代理转换问题

时间:2014-05-22 10:45:18

标签: java rmi

我正在尝试让RMI程序正常运行。到目前为止,服务器正常启动,但客户端无法将远程对象转换为接口。

  

线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException:   com.sun.proxy。$ Proxy0无法强制转换为MonitorClient.InterfaceMonitor

我发现的所有其他答案都是针对最终用户已经过相当于InterfaceMonitorImpl(客户端未知)而不是Interface的情况。这不是我的情况,我真的不知所措--RMI是噩梦。

服务器端

主:

    InterfaceMonitor obj;
    try {
        LocateRegistry.createRegistry(1099);

        InterfaceMonitor stub = (InterfaceMonitor) UnicastRemoteObject.exportObject(new InterfaceMonitorImpl(), 0);

        Registry registry = LocateRegistry.getRegistry();
        registry.bind("imon", stub);

        System.out.println("Server ready");
    } catch (RemoteException | AlreadyBoundException ex) {
        System.out.println("Server error: " + ex.toString());
    }

InterfaceMonitor.java:

public interface InterfaceMonitor extends Remote {
    int checkAge() throws RemoteException; 
}

InterfaceMonitorImpl.java:

public class InterfaceMonitorImpl implements InterfaceMonitor {

    public InterfaceMonitorImpl() throws RemoteException {

    }

    @Override
    public int counter() throws RemoteException {
        return 10;
    }

}

客户端

    try {
        Registry reg = LocateRegistry.getRegistry(null);
        InterfaceMonitor im = (InterfaceMonitor) reg.lookup("imon");

        int counter = im.counter();
        System.out.println("Counter: " + counter);
    } catch (NotBoundException | RemoteException ex) {
        Logger.getLogger(MonitorGUI.class.getName()).log(Level.SEVERE, null, ex);
    }

InterfaceMonitor.java也在客户端。

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

显然,你必须在InterfaceMonitor:中有两个MonitorClient一个副本,而MonitorServer.中有一个副本可能有两个不同的类。不是同一类的两个副本。类名,包,方法声明,继承,......都必须相同。