RMI调用上的IllegalArgumentException

时间:2014-10-05 06:34:49

标签: java rmi illegalargumentexception

我有以下类定义:

public class Client extends AbstractServer implements IClient

public abstract class AbstractServer implements IServer

目标是使用Java RMI创建分布式/对等游戏(用于学校作业)。 P2P在某种意义上说,在一开始,有1个客户端充当"服务器"接受客户端加入游戏等的请求。如果旧主服务器发生故障,该主服务器还会选择备用服务器作为主服务器(然后选择新备份)。

从这个意义上讲,所有客户都可以充当服务器。这就是为什么我以这种方式建模Client(扩展实现服务器代码的AbstractServer

问题是:在客户的主要方法中:

client = new Client();
Registry registry = LocateRegistry.getRegistry(host);
IServer stub = (IServer) registry.lookup("Maze");

client.id = stub.joinGame(client); // this line triggers exception

异常详情:

java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at sun.rmi.transport.Transport$1.run(Transport.java:174)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:275)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:252)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
    at com.sun.proxy.$Proxy0.joinGame(Unknown Source)
    at client.Client.main(Client.java:31)

什么错了? IServer实现如下:

public interface IServer extends Remote {
    public int joinGame(Client client) throws RemoteException;
    ...
}

为什么会出现这个问题? joinGame接受我提供的Client

顺便说一下:来源位于 GitHub

1 个答案:

答案 0 :(得分:1)

您已经在编译和部署到服务器或客户端之间更改了远程接口;或者您在不同的包中使用相同的名称。