Reputation: 88197
I have the following class definitions:
public class Client extends AbstractServer implements IClient
public abstract class AbstractServer implements IServer
The goal is to create a distributed/peer to peer game (for a school assignment) using Java RMI. P2P in a sense that at the start, there is 1 client that acts as the "server" accepting client's requests to join game etc. This primary server also selects a backup server, that functions as the primary (then selecting a new backup) if the old primary fails.
In this sense, all clients can act as a server. Thats why I modeled the Client
this way (extending an AbstractServer
which implements the server code)
The problem is: In client's main method:
client = new Client();
Registry registry = LocateRegistry.getRegistry(host);
IServer stub = (IServer) registry.lookup("Maze");
client.id = stub.joinGame(client); // this line triggers exception
Exception details:
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)
Whats wrong? The IServer implementation looks like:
public interface IServer extends Remote {
public int joinGame(Client client) throws RemoteException;
...
}
Why the problem? joinGame
accepts a Client
which I provided?
By the way: the source is on GitHub
Upvotes: 0
Views: 856
Reputation: 310893
You've changed your remote interface between compiling and deploying to either server or client; or you have classes by the same name in different packages.
Upvotes: 1