java - 注册 RMI 客户端会导致 IllegalArgumentException

标签 java exception client-server rmi remoteobject

我有一个简单的 RMI - 客户端、服务器架构。因为我想从服务器进行回调,所以我定义了以下接口(interface):

    public interface Meiern_RMI_Server extends Remote{
        public boolean registerClient(RMIClient client) throws RemoteException;
    }
    public interface Meiern_RMI_Client extends Remote{
        public void setTurn(boolean yourTurn) throws RemoteException;
    }

这里是 Impl(服务器):

public class RMIServer extends UnicastRemoteObject implements Meiern_RMI_Server{

    private Set<RMIClient> clients;

    public RMIServer() throws RemoteException {
        super();
        this.clients = new HashSet<RMIClient>();
    }

    public static void main(String [] args ){
        try {
            Registry reg = LocateRegistry.createRegistry(1234);
            reg.rebind("server", new RMIServer());
            System.out.println("server started");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public synchronized boolean registerClient(RMIClient client) throws RemoteException {
        boolean registered = false;
        try {
            registered =  clients.add(client);
            if(registered) {
                System.out.println("Client " + client.getName() + " registered.");
                System.out.println(clients);
            } else {
                System.out.println("Could not register client. Duplicate names " + client.getName());               
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return registered;
    }

}

客户:

public class RMIClient extends UnicastRemoteObject implements Meiern_RMI_Client {       public RMIClient() throws RemoteException {
        super();
    }

    @Override
    public void setTurn(boolean yourTurn) throws RemoteException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    public static void main(String [] args) {
        try {
            RMIClient client = new RMIClient();

            Registry reg = LocateRegistry.getRegistry("127.0.0.1", 1234);
            Meiern_RMI_Server rmi = (Meiern_RMI_Server)reg.lookup("server");
            System.out.println("client connected");
            boolean registered = rmi.registerClient(client);
            if(registered){
                System.out.println("Client registered");
            } else {
                System.out.println("Could not register client, Change name");
            }

            while (true) {

            }
        } catch (Exception e) {
            System.out.println("Could not connect to server: ");
            e.printStackTrace();
        }
    }


}

尝试注册客户端时,客户端出现以下异常:

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.$Proxy1.registerClient(Unknown Source)
    at meiern.RMIClient.main(RMIClient.java:97)

有什么建议吗?

最佳答案

public boolean registerClient(RMIClient client) throws RemoteExceptio

您不能使用导出的远程对象类型作为远程方法参数或返回类型。将其更改为:

public boolean registerClient(Myeiern_RMI_Client client) throws RemoteException

关于java - 注册 RMI 客户端会导致 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27354971/

相关文章:

java - Java 中的客户端服务器通信 - 使用哪种方法?

c - 在 C 套接字通信中设置多个定时器

java - 线程上的方法执行 - 未执行/在完成之前结束

java - Spring数据查询的最大限制和条件

java - Selenium 无法识别 IE 中新打开的浏览器上的元素

java - 在 Java/Android 中抛出自定义异常

java - 抛出什么异常?

Java ImageIO.read(文件与 URL)

c# - 如果在 MVC 之后添加到 IApplicationBuilder,则开发人员异常页面为空白

c# - .NET 客户端/服务器可扩展性和异步 I/O - 过多线程问题