簡體   English   中英

Java RMI - 傳遞對象

[英]Java RMI - Passing Objects

我正在智能手機上的Raspberry PiAndroid-App上運行Java程序。 該應用程序應該能夠調用在Raspi上運行的Raspi 由於Android不包含標准的Java RMI包,我使用了LipeRMIhttpLipeRMI

到目前為止, 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) ,第一個參數必須是表示接口的類,第二個參數必須是實現此接口的類的實例。 在這里,您提供了一個ArrayList作為第二個參數,它顯然不是ServerInt一個實例,這就是您獲得此異常的原因。

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

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

在這種情況下,第一個參數是接口MyRemoteListener和第二個是一個實例MyRemoteListenerImpl這是接口的實現MyRemoteListener


要公開你的List你可以嘗試callHandler.registerGlobal(List.class, list)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM