Java RMI - 传递对象

Java RMI - Passing Objects

我正在运行在 Raspberry PiAndroid-App 智能手机上编写 Java 程序。该应用程序应该能够在 Raspi 上调用方法 运行ning。 由于 Android 不包含标准 Java RMI 包,我使用 LipeRMI: http://lipermi.sourceforge.net/

到目前为止一切顺利,LipeRMI 确实可以很好地传递原始数据类型,例如 boolean 或 int。

我现在想做的是将 ArrayList<String> 从服务器传递到应用程序,但每次我 运行 该方法时,我都会收到以下错误:

LipeRMIException:Class java.util.ArrayList is not assignable from control.ServerInt
at lipermi.handler.CallHandler.exportObject(CallHandler.java:54)
at lipermi.handler.CallHandler.exportObject(CallHandler.java:48)
at control.RMIServer.createServer(RMIServer.java:26)
at control.Main.main(Main.java:17)

我不明白我在这里做错了什么。

RMIServer.java

public class RMIServer implements ServerInt{
    private static final long serialVersionUID = 1L;
    private ArrayList<String> list;

    public RMIServer()  {
    list = new ArrayList<String>();
        list.add("50:25:5:-1");
        list.add("99:42:6:4");

        createServer();
    }

    public void createServer() {
        try {
            CallHandler callHandler = new CallHandler();
            callHandler.registerGlobal(ServerInt.class, this);
            callHandler.exportObject(ServerInt.class, list);
            Server server = new Server();
            server.bind(7777, callHandler);

            server.addServerListener(new IServerListener() {

                @Override
                public void clientDisconnected(Socket socket) {}

                @Override
                public void clientConnected(Socket socket) {}
            });

        } catch (LipeRMIException | IOException e) {
            e.printStackTrace();
        }    
    }


    @Override
    public ArrayList<String> getPWMLines() {       
        return list;
    }   
}

ServerInt.java

import java.util.ArrayList;

public interface ServerInt{          
    public ArrayList<String> getPWMLines();   
}

您显然误用了方法 CallHandler#exportObject(Class, Object) 第一个参数必须是表示接口的 class,第二个参数必须是实现该接口的 class 的实例。在这里,您提供了一个 ArrayList 作为第二个参数,这显然不是 ServerInt 的一个实例,这就是您得到此异常的原因。

下面是如何使用此方法的一个很好的示例:

MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);

在这种情况下,第一个参数是接口 MyRemoteListener,第二个参数是 MyRemoteListenerImpl 的一个实例,它是接口 MyRemoteListener.

的一个实现

要暴露你的 List 你可以试试 callHandler.registerGlobal(List.class, list)