Java RMI调用时出现IllegalArgumentException

Java RMI调用时出现IllegalArgumentException,java,rmi,illegalargumentexception,Java,Rmi,Illegalargumentexception,我有以下类定义: public class Client extends AbstractServer implements IClient public abstract class AbstractServer implements IServer 目标是使用JavaRMI创建分布式/点对点游戏(用于学校作业)。P2P在某种意义上说,一开始,有一个客户端充当“服务器”,接受客户端加入游戏等的请求。该主服务器还选择一个备份服务器,如果旧主服务器出现故障,该服务器将作为主服务器(然后选择一个

我有以下类定义:

public class Client extends AbstractServer implements IClient

public abstract class AbstractServer implements IServer
目标是使用JavaRMI创建分布式/点对点游戏(用于学校作业)。P2P在某种意义上说,一开始,有一个客户端充当“服务器”,接受客户端加入游戏等的请求。该主服务器还选择一个备份服务器,如果旧主服务器出现故障,该服务器将作为主服务器(然后选择一个新备份)

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

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

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
接受我提供的
客户端


顺便说一下:源代码在

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

对此不确定。但是您是否尝试使用
IClient
作为
joinGame
中的形式参数类型?比如:public
intjoingame(IClient客户端)
。这就是我通常在RMI上编写代码的方式。