我有以下类定义:
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
答案 0 :(得分:1)
您已经在编译和部署到服务器或客户端之间更改了远程接口;或者您在不同的包中使用相同的名称。