Jiew Meng
Jiew Meng

Reputation: 88197

IllegalArgumentException on RMI Call

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

Answers (1)

user207421
user207421

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

Related Questions